我对sed和regex有点新鲜。
我正在尝试编辑一个文本文件,我希望将第一个文件中两个关键字之间的内容替换为另一个文本文件的全部内容
它应该是这样的 -
keyword1 inbetweenstuff keyword2
到这个
keyword1 textfromfile2 keyword2
我正在尝试这个命令,但没有运气
sed -i 's/(keyword1).*(keyword2)/\1 contentsoffile2 \2/g' file1.txt
答案 0 :(得分:3)
您尝试使用错误的工具。 sed用于单独行(s/old/new/
)上的简单替换,即全部。对于任何更有趣的事情,你应该使用awk。
使用GNU awk进行多字符RS,gensub()和第3次arg进行匹配():
$ cat file1
keyword1 IN BETWEEN
STUFF ON
ONE OR MORE
LINES keyword2
$ cat file2
NOW IS
THE WINTER OF
OUR DISCONTENT
$ cat tst.awk
BEGIN { RS="^$"; ORS="" }
NR==FNR { new = gensub(/\n$/,"",""); next }
match($0,/(.*keyword1 ).*( keyword2.*)/,a) { print a[1] new a[2] }
$ awk -f tst.awk file2 file1
keyword1 NOW IS
THE WINTER OF
OUR DISCONTENT keyword2
请注意,上面将file2
的内容视为文字字符串,因此" file2"的内容可以是任何东西。如果" file2"请尝试任何sed解决方案。例如,包含&
(或\1
或/
或...)。它也不关心file2中有多少行,或者file1中的关键字之间有多少行。
答案 1 :(得分:1)
这里有一个随时可用的解决方案:
$ sed -i "s/\(keyword1\).*\(keyword2\)/\1 `cat file2` \2/g" file1
它从file2
读取并替换file1
内的两个关键字之间的文字(仅当file2
中的内容不是多行时才有效。)
答案 2 :(得分:1)
这可能适合你(GNU sed):
sed -e '/keyword1\s*/{:a;/\s*keyword2/!{N;ba};s/\n//g;s/keyword1\s*/&\n/;s/\s*keyword2/\n&/;P;e cat inserted_file' -e 's/.*\n//}' file
这将查找keyword1
并将该行以及后续行保留在模式空间中的keyword2
之前。然后删除所有换行符,并在keyword1
之后和keyword2
之前插入换行符。然后打印keyword1
之前的部分行,然后是inserted_file
,最后是keyword2
到其行尾。
这将使用换行符围绕inserted_file
。如果不需要这些,则使用以下命令处理该文件:
sed -r 'N;s/(keyword1\s*)\n/\1/;s/\n(\s*keyword2)/\1/;P;D' new_file