sed 命令用另一个文件的内容替换文件中最后一次出现的单词

Sau*_*rav 0 shell sed shell-script text-processing macos

  1. macOSsed命令替换文件中最后一次出现的单词
  2. 替换为另一个文件的内容
  3. 只替换最后一次出现,意味着只替换一次。
  4. 这个词可以是一个子串abchellohelloabc
  5. 单词后可以有尾随空格或换行符

sample_file_path = "/Users/saurav/sample.text" sample_file_path_1 = "/Users/saurav/sample1.text"

sample.txt

hello
hi
hello
ok
Run Code Online (Sandbox Code Playgroud)

sample1.txt

I
am 
doing
great
Run Code Online (Sandbox Code Playgroud)

预期输出 ( sample.txt):

hello
hi
I
am 
doing
great
ok
Run Code Online (Sandbox Code Playgroud)

需要使用文件路径变量

Kus*_*nda 6

分三步,使用sed/usr/bin/sedmacOS兼容的语法,以及bashor zsh(当前 macOS 系统上的两个主要 shell):

sed -n '/hello/=' sample.txt |
sed -e '$!d' -e $'s/.*/&r sample1.txt\\\n&d/' |
sed -f /dev/stdin sample.txt
Run Code Online (Sandbox Code Playgroud)

sed分三步使用:

  1. 查找sample.txt匹配的所有行hello并输出与这些行对应的行号。

  2. 删除除第一步输出的最后一行之外的所有行号(使用$!d“如果这不是最后一行,将其删除”),并创建一个两行sed脚本,该脚本将通过首先读取sample1.txt然后删除最后一个匹配行来修改原线。鉴于最后一个匹配hello是在原始文件的第 3 行,这个脚本看起来像

    3r sample1.txt
    3d
    
    Run Code Online (Sandbox Code Playgroud)
  3. sed在文件上应用构建的脚本sample.txt

您是否要进行“就地”编辑,以便sample.txt修改原始内容,然后使用

3r sample1.txt
3d
Run Code Online (Sandbox Code Playgroud)

相同的一组命令,但使用您的变量$sample_file_path$sample_file_path_1两个文件路径:

sed -n '/hello/=' sample.txt |
sed -e '$!d' -e $'s/.*/&r sample1.txt\\\n&d/' |
sed -i '' -f /dev/stdin sample.txt
Run Code Online (Sandbox Code Playgroud)

请注意,我已将第二个命令中的分隔符从/更改,为 ,因为文件路径包含斜杠。您可以在s///命令中使用任何不属于正则表达式或替换文本的字符作为分隔符。