Sau*_*rav 0 shell sed shell-script text-processing macos
sed命令替换文件中最后一次出现的单词abchello或helloabcsample_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)
需要使用文件路径变量
分三步,使用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分三步使用:
查找sample.txt匹配的所有行hello并输出与这些行对应的行号。
删除除第一步输出的最后一行之外的所有行号(使用$!d“如果这不是最后一行,将其删除”),并创建一个两行sed脚本,该脚本将通过首先读取sample1.txt然后删除最后一个匹配行来修改原线。鉴于最后一个匹配hello是在原始文件的第 3 行,这个脚本看起来像
3r sample1.txt
3d
Run Code Online (Sandbox Code Playgroud)
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///命令中使用任何不属于正则表达式或替换文本的字符作为分隔符。