【问题标题】:/r in sed shell script/r 在 sed shell 脚本中
【发布时间】:2023-03-18 21:14:01
【问题描述】:

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

sed '/EOF/r $thingToAdd' $fileToAddItTo > $newFileOutput

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

有什么想法吗?

【问题讨论】:

    标签: shell replace sed


    【解决方案1】:

    r 用于读取文件并将其追加到当前点。

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

    换句话说:

    $fileToAddItTo  +  $thingToAdd  =  $newFileOutput
    --------------     -----------     --------------
    1                  5               1
    2                  6               2
    3                                  3
    EOF                                EOF
    4                                  5
                                       6
                                       4
    

    您可以在以下记录中看到这一点:

    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
    

    并且,针对您评论中关于是否会为包含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
    

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

    否则它会拾取您可能没想到的行,例如包含 HEREOFWRITEOFFNEOFACISM 的行。

    【讨论】:

    • 谢谢!这是否意味着文件 $thingToAdd 应该插入到 EOF 在 $fileToAddItTo 中的任何位置?
    猜你喜欢
    • 2023-03-16
    • 2011-10-23
    • 2013-12-03
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多