sed 怪异,无与伦比的 {

bin*_*.uk 11 sed command-line

我正在尝试使用 r (read 命令将 data2 的内容附加到数据。我想在包含“two”的行之后附加内容。我想删除包含“two”的行。

但我撞到了一堵砖墙。感觉就像一个错误,但也许这只是我自己的愚蠢。

好的,这个命令有效。

% sed -r '/two/ r /tmp/data2' <  /tmp/data
one
two
five
six
seven
three
four
Run Code Online (Sandbox Code Playgroud)

Sed 似乎对空间有点挑剔......原因不明显,但我会接受它。

% sed -r '/two/ r /tmp/data2  ' <  /tmp/data
one
two
three
four
Run Code Online (Sandbox Code Playgroud)

我的目标是在读取命令后运行 (d) 删除以删除原始行。这是我所得到的。

% sed -r '/two/{ r /tmp/data2}' <  /tmp/data
sed: -e expression #1, char 0: unmatched `{'
Run Code Online (Sandbox Code Playgroud)

我很确定 '{' 正在匹配,它不是世界上最长的命令。

我真正想跑的...

% sed -r '/two/{ r /tmp/data2; d }' <  /tmp/data
Run Code Online (Sandbox Code Playgroud)

系统是 Ubuntu 12. GNU SED。

Pet*_*r.O 11

r /file/path 它后面不能有任何内容。

您可能会发现此站点作为sed命令摘要很有帮助

echo 'one
two
five
six
seven
three
four' >inputfile

echo 'contents of readfile' >readfile

sed  '/two/{r readfile
         d}' inputfile
Run Code Online (Sandbox Code Playgroud)

注意:您可以使用 shell通过使用“双引号”来参数化sed。它们启用 shell 变量扩展。r从字面上看所有空格......所以不要引用文件名,并且没有任何尾随空格(r和之间的空格/file/path是可以的)。

rfile='/tmp/readfile with   multiple spaces in name'
sed  "/two/{r $rfile
       d}" inputfile
Run Code Online (Sandbox Code Playgroud)

输出

one
contents of readfile
five
six
seven
three
four
Run Code Online (Sandbox Code Playgroud)

附带说明:<输入文件确实没有任何价值。使用 sed 的输入文件参数(它使事情更简单)。

  • 这是单行(对于那些*必须* :)... `sed -f &lt;(sed 's/\\n/\n/'&lt;&lt;&lt;"/two/{r $rfile\nd} ") inputfile` .. 如果你喜欢它,给我一个 upvote :) (2认同)

小智 6

用多个“-e”标志来打破它,每一行一个

% sed -e '/two/{ r /tmp/data2' -e 'd}' <  /tmp/data
Run Code Online (Sandbox Code Playgroud)