我正在尝试使用 r(读取命令将 data2 的内容附加到数据。我想将内容附加到包含“two”的行后面。我想删除包含“two”的行。
但我遇到了麻烦。感觉就像是遇到了一个错误,但也许这只是我自己的愚蠢。
好的,这个命令有效。
% sed -r '/two/ r /tmp/data2' < /tmp/data
one
two
five
six
seven
three
four
Sed 似乎对空格有点挑剔。原因不明显,但我会忍受它。
% sed -r '/two/ r /tmp/data2 ' < /tmp/data
one
two
three
four
我的目标是在 read 命令后运行 (d) delete 以删除原始行。这是我能做到的。
% sed -r '/two/{ r /tmp/data2}' < /tmp/data
sed: -e expression #1, char 0: unmatched `{'
我很确定 '{' 被匹配,它不是世界上最长的命令。
我真正想要运行的是...
% sed -r '/two/{ r /tmp/data2; d }' < /tmp/data
系统是Ubuntu 12。GNU SED。
答案1
r /file/path
其后不得有任何内容。
您可能会发现此网站对您有帮助sed 命令摘要
echo 'one
two
five
six
seven
three
four' >inputfile
echo 'contents of readfile' >readfile
sed '/two/{r readfile
d}' inputfile
注意:你可以利用 shell参数化sed,使用“双引号”。它们启用 shell 变量扩展。r
按字面意思理解所有空格...所以不要引用文件名,也不要有任何尾随空格(r
和之间的空格/file/path
是可以的)。
rfile='/tmp/readfile with multiple spaces in name'
sed "/two/{r $rfile
d}" inputfile
输出
one
contents of readfile
five
six
seven
three
four
附注:<
对于您的输入文件来说,使用 sed 的输入文件参数实际上没有任何价值(它使事情变得更简单)。
答案2
使用多个“-e”标志进行中断,每行一个
% sed -e '/two/{ r /tmp/data2' -e 'd}' < /tmp/data