【问题标题】:Use sed to insert another sed command in a file使用 sed 在文件中插入另一个 sed 命令
【发布时间】:2016-06-20 22:59:01
【问题描述】:

我正在尝试使用 sed 在文件的每一行末尾插入 sed 命令,使用 -

sed -r 's/$/ | sed -r s\/abc\/xyz\/ /' filename.extension

接下来我想要的是在内部 sed 周围加上单引号。所以它看起来像-

sed -r 's/$/ | sed -r 's\/abc\/xyz\/' /' filename.extension

我尝试转义内部单引号,但没有用。

基本上,我想要以下几行 -

line 1 line 2 line 3

变成-

line 1 | sed -r 's/abc/xyz/' line 2 | sed -r 's/abc/xyz/' line 3 | sed -r 's/abc/xyz/'

即使使用转义字符,我也无法获得单引号。

【问题讨论】:

    标签: linux unix sed


    【解决方案1】:
    sed -e "s:$: | sed -r 's/abc/xyz/':" yourfile
    

    您的问题是嵌套 shell 表达式的一般情况的示例。有很多方法可以做到这一点。

    1. 使用备用分隔符。这就是我在这里所做的。
    2. 将子表达式分配给变量,然后展开它们。
    3. 使用大量的\ 转义符。
    4. 将您的子表达式放在一个文件中并read它。

    【讨论】:

    • 我不会用 xyz 替换 abc。它在第二个 sed 命令中有另一个正则表达式,因此是引号。
    • 啊哈,好吧,我很高兴您将示例压缩到最小的程度,并且您还指定了所需行为的示例。这是提问的正确方式。
    【解决方案2】:

    在内部 sed 中使用替代分隔符,在外部 sed 中使用双引号来简化您的命令:

    sed "s/$/ | sed -r 's~abc~xyz~'/" file.ext
    

    btw -r 在内部 sed 中并不真正需要

    【讨论】:

    • 单引号和双引号相对于 bash 有什么区别?
    • 你不能将单引号嵌套在 shell 中的另一个单引号中
    • 是的,确实如此。现在可以将单引号打印到文件中。虽然,我有转义数字和反斜杠(在内部 sed 的替换字符串中)为 - sed "s/$/ | sed -r 's~([0-9]+).*~\\\1~'/" filename.ext 试图弄清楚为什么只有替换字符串需要转义,而不是内部 sed 的第一个分隔符之后的字符串,即“([ 0-9]+)" 这个
    • 使用双引号时,每个转义都需要加倍,因此\1 将变为\\1
    【解决方案3】:

    这可能对你有用(GNU sed):

    sed 's/$/ | sed -r '\''s\/abc\/xyz\/'\''/' file
    

    使用'\'' 结束当前单引号,然后在shell 中使用\' 引用单引号,最后使用单引号开始sed 命令的引用。在 sed 命令中使用\/ 引用正斜杠。

    由于替换命令可以使用任何分隔符:

    sed 's#$# | sed -r '\''s/abc/xyz/'\''#' file
    

    减少引用量并且:

    sed "s#$# | sed -r 's/abc/xyz/'#" file
    

    进一步减少。然而,双引号 sed 命令(或任何实用程序)可能会产生不必要的副作用,即元字符可以由 shell 评估,因此最好使用单引号并使用“孔状”机制 '\''

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      相关资源
      最近更新 更多