grep to sed,在字符串匹配后附加,但在行尾添加

时间:2016-10-05 13:43:20

标签: bash sed

我有以下文本文件,其中包含以下行:

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

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

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

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

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语句以向我提供所请求的行?

4 个答案:

答案 0 :(得分:1)

您可以直接使用sed完成此操作。切割不应该是必要的:

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

答案 1 :(得分:1)

试试这个:

这就是你的文件的样子。

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 >

请告诉我这是否适合您。

答案 2 :(得分:1)

你可以在sed中使用组来完成。要创建新输出,您可以执行以下操作:

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

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

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

说明:

  • ()是一个群组。您可以使用\1来引用它。在sed中,我们必须逃避括号:\(\)
  • [^"]*匹配所有非引用的内容。所以比赛将在报价之前停止
  • 在替换中,您必须手动添加引用,因为它在组外。所以你可以把东西放在报价之前。

答案 3 :(得分:1)

awk 'sub("[0-9]+","&.HELLO")' file