sed 怪异,无与伦比 {

sed 怪异,无与伦比 {

我正在尝试使用 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

相关内容