【问题标题】:How to apply one command into another sed command?如何将一个命令应用于另一个 sed 命令?
【发布时间】:2021-01-07 10:23:43
【问题描述】:

我有一个命令用于提取两个字符串模式“string1”和“string2”之间的行。这存储在名为“var1”的变量中。

var1=$(awk '/string1/{flag=1; next} /string2/{flag=0} flag' text.txt)

此命令运行良好,输出为一组行。

Do you hear the people sing?
Singing a song of angry men?
It is the music of a people
Who will not be slaves again

我希望将上述命令的输出插入到另一个名为 stat.txt 的文件中的字符串模式“string3”之后。我使用sed如下

sed '/string3/a'$var1'' stat.txt

我无法获得新的输出。在这里, $var1 似乎部分工作,即只有一行 -

string3

Do you hear the people sing?

还有其他解决这个问题的建议吗?

【问题讨论】:

    标签: sed


    【解决方案1】:

    我很想使用sed 提取这些行,并使用awk 将它们插入到其他文本中:

    lines=$(sed -n '/string1/,/string2/ p' text.txt)
    awk -v new="$lines" '{print} /string3/ {print new}' stat.txt
    

    或者可能在一个 awk 调用中同时完成两个任务

    awk '
        NR == FNR && /string1/ {flag = 1}
        NR == FNR && /string2/ {flag = 0}
        NR == FNR && flag      {lines = lines $0 ORS}
        NR == FNR              {next}
    
                  {print}
        /string3/ {printf "%s", lines}  # it already ends with a newline
    ' text.txt stat.txt
    

    【讨论】:

    • 谢谢!它适用于“sed”提取行并使用“awk”粘贴它。
    • 假设是否需要在特定行中的“string3”模式之前而不是之后打印。我可以这样使用吗 awk -v new="$lines" '{print new} /string3/ ' stat.txt
    【解决方案2】:

    这是数据格式问题...

    使用sed 附加一个多行文本块 append 命令要求要附加的块中的每一行都以\ 结尾——除了最后一个该块的行。因此,如果我们取出问题中没有工作的两行代码,并按照 append 命令的要求重新格式化文本,原始代码应该可以按预期工作:

    var1=$(awk '/string1/{flag=1; next} /string2/{flag=0} flag' text.txt)
    var1="$(sed '$!s/$/\\/' <<< "$var1")"
    sed '/string3/a'$var1'' stat.txt
    

    请注意,上面的第二行包含bashism。更便携的版本是:

    var1="$(echo "$var1" | sed '$!s/$/\\/')"
    

    任何一种变体都会将$var1 转换为:

    Do you hear the people sing?\
    Singing a song of angry men?\
    It is the music of a people\
    Who will not be slaves again
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2013-11-08
      • 2022-01-24
      • 1970-01-01
      相关资源
      最近更新 更多