【问题标题】:grep to sed, append after string match but instead on end of linegrep 到 sed,在字符串匹配之后追加,而不是在行尾
【发布时间】:2017-02-13 23:58:04
【问题描述】:

我有以下带有以下行的文本文件:

<test="123">
<test="456">
<test="789">

我的目标是让上面的文本文件在上面的数字后面附加一个关键字“HELLO”,如下所示:

  <test="123.HELLO">
  <test="456.HELLO">
  <test="789.HELLO">

使用 grep 命令和剪切,我设法得到引号之间的值。

grep -o "test=".* test.txt | cut -d \" -f2

我尝试在它上面使用 sed,这条线

grep -o "test=".* test.txt | cut -d \" -f2 | sed -i -- 's/$/.HELLO/' test.txt

但是我设法得到的最接近的是直接附加在行尾的“.HELLO”(而不是在引号之间的数字之后)

<test="123">.HELLO 
<test="456">.HELLO 
<test="789">.HELLO

如何修复我的 sed 语句以向我提供请求的行?

【问题讨论】:

  • 您能否澄清一下:1) 预期输出行前的空格是必需的,或者由于格式原因此处错误显示 2) 您的输入文件是否包含不包含 test= 的行?如果是这样,它们是否也应该成为输出的一部分

标签: bash sed


【解决方案1】:

您可以在 sed 中使用组来完成此操作。要创建新输出,您可以这样做:

 sed 's/\(test="[^"]*\)"/\1.HELLO"/g' test.txt

要就地修改它,您可以使用-i 开关:

 sed -i 's/\(test="[^"]*\)"/\1.HELLO"/g' test.txt

解释:

  • () 是一个群组。您可以通过\1 参考。在 sed 中,我们必须转义括号:\(\)
  • [^"]* 匹配所有不是引用的内容。所以比赛将在引用之前停止
  • 在替换中,您必须手动添加报价,因为它在组之外。因此,您可以在引用之前添加内容。

【讨论】:

    【解决方案2】:

    试试这个:

    这就是你的文件的样子。

    bash > cat a.txt
    <test="123">
    <test="456">
    <test="789">
    

    您的文本通过管道传输到 SED

    bash > cat a.txt |sed 's/">/.HELLO">/g'
    <test="123.HELLO">
    <test="456.HELLO">
    <test="789.HELLO">
    bash >
    

    如果这对你有用,请告诉我。

    【讨论】:

      【解决方案3】:
      awk 'sub("[0-9]+","&.HELLO")' file
      

      【讨论】:

        【解决方案4】:

        您可以直接使用 sed 完成此操作。不需要剪切:

        grep "test=" test.txt | sed 's/"\(.*\)"/"\1.HELLO"/'
        

        【讨论】:

        • grep 也是不必要的,在这种情况下也不应该使用-o 选项。您可以在 grep 命令中添加一些示例文件名...
        • 好电话,编辑了我的答案。我留下了 grep,以防 OA 想要遗漏的文件中有多余的行。当然也可以直接用sed来完成,不过这样看起来更简单。
        • 现在好了 :) sed -n '/test=/ s/"\(.*\)"/"\1.HELLO"/p' test.txt 也很简单,但我明白你的意思:)
        猜你喜欢
        • 2021-09-17
        • 1970-01-01
        • 1970-01-01
        • 2015-08-17
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多