在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的用法,但我感到很困惑。任何指针都会受到赞赏。
答案 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分钟并帮助很多。