/r 在 sed shell 脚本中

Tyl*_*itt 1 shell replace sed

我正在更新使用 sed 命令的 C shell 脚本:

sed '/EOF/r $thingToAdd' $fileToAddItTo > $newFileOutput
Run Code Online (Sandbox Code Playgroud)

我似乎找不到 /r 命令的含义或作用。我认为它是用于查找和替换(类似于/s..../g)。

有任何想法吗?

pax*_*blo 6

r用于读取文件并将其附加到当前位置。

您的示例中的点是地址/EOF/,这意味着该脚本将找到包含该点的行EOF,然后将其附加到该点之后指定的文件$thingToAdd。然后它将处理文件的其余部分。

换句话说:

$fileToAddItTo  +  $thingToAdd  =  $newFileOutput
--------------     -----------     --------------
1                  5               1
2                  6               2
3                                  3
EOF                                EOF
4                                  5
                                   6
                                   4
Run Code Online (Sandbox Code Playgroud)

您可以在下面的文字记录中看到这一点:

pax$ cat file1 ; echo === ; cat file2
file1_line:1
file1_line:2
file1_line:3
file1_line:4 EOF
file1_line:5
===
file2_line:1
file2_line:2

pax$ sed '/EOF/r file2' file1
file1_line:1
file1_line:2
file1_line:3
file1_line:4 EOF
file2_line:1
file2_line:2
file1_line:5
Run Code Online (Sandbox Code Playgroud)

并且,为了回答您评论中关于是否会对包含字符串的每一行执行此操作的问题EOF,是的,它会:

pax$ cat file1 ; echo === ; cat file2
file1_line:1
file1_line:2 EOF
file1_line:3
file1_line:4 EOF
file1_line:5
===
file2_line:1
file2_line:2

pax$ sed '/EOF/r file2' file1
file1_line:1
file1_line:2 EOF
file2_line:1
file2_line:2
file1_line:3
file1_line:4 EOF
file2_line:1
file2_line:2
file1_line:5
Run Code Online (Sandbox Code Playgroud)

并且,它会对包含EOF字符串的每一行执行此操作。通常,您会将这样的内容限制为包含字符串的行EOF,因为这通常是它的设置方式(其中 是EOF该行的唯一内容)。您只需将地址更改为/^EOF$/^$分别是行首和行尾锚点)即可做到这一点。

否则,它会拾取您可能意想不到的行,例如包含HEREOF,WRITEOFF或 的行NEOFACISM