linux shell:在匹配行之后将文本前置或附加到下一行

时间:2013-08-20 00:17:47

标签: linux shell replace sed append

在Linux中使用shell脚本(bash或csh)。我想找到与给定文本模式匹配的所有行,并为每行添加或追加(取决于应用程序)文本到下一行。

例如,对于包含以下行的文件:

HEADER 1
 12345

HEADER 2
 12345

HEADER 1
 12345

HEADER 2
 12345

如果我正在搜索“HEADER 1”,并且想要附加文本“ABCDE”,则输出将为:

HEADER 1
 12345 ABCDE

HEADER 2
 12345

HEADER 1
 12345 ABCDE

HEADER 2
 12345

我还有一些案例需要ABCDE在12345之前。

为了这个目的,我一直在努力了解sed的用法,但我感到很困惑。任何指针都会受到赞赏。

3 个答案:

答案 0 :(得分:4)

尝试此命令:

sed '/HEADER 1/{n;s/$/ ABCDE/}' input.txt

这是逻辑:

for each line in 'input.txt'    
    if line matches /HEADER 1/
        read next line
        append string ' ABCDE'
    endif    
endfor

答案 1 :(得分:1)

sed是在单行上进行简单替换的优秀工具,其他任何东西只需使用awk实现可移植性,可扩展性,简洁性,可读性等等:

$ awk 'found{print $0, "ABCDE"; found=0; next} {print} /HEADER 1/{found=1}' file
HEADER 1
 12345 ABCDE

HEADER 2
 12345

HEADER 1
 12345 ABCDE

HEADER 2
 12345

和pre-pend只是“ABCDE”和$ 0的顺序切换:

$ awk 'found{print "ABCDE", $0; found=0; next} {print} /HEADER 1/{found=1}' file
HEADER 1
ABCDE  12345

HEADER 2
 12345

HEADER 1
ABCDE  12345

HEADER 2
 12345

如果你使用s,g,p(和-n)以外的sed语言结构,那么你使用了错误的工具,因为所有其他的sed语言结构在1970年代中期发明awk时已经过时了。

如果您对此表示怀疑,请尝试修改生成上述输出的sed脚本以执行其他操作,例如:打印在它执行该操作的每一行末尾添加ABCDE的次数。这是awk:

$ awk 'found{print $0, "ABCDE", ++count; found=0; next} {print} /HEADER 1/{found=1}' file
HEADER 1
 12345 ABCDE 1

HEADER 2
 12345

HEADER 1
 12345 ABCDE 2

HEADER 2
 12345

我害怕想想做一些简单的事情会是什么样的。

答案 2 :(得分:0)

如果您对一般的文本管道Linux应用程序感到困惑,我建议您浏览this exercise on the Learn Linux the Hard Way course。应该花4-5分钟并帮助很多。