用sed或awk替换文本块

时间:2014-05-21 07:26:14

标签: awk sed

这是来自文件的片段:

COMMAND : /* some text 1 */
ACTION : /* some text 1 in multiple lines */
COMMAND : /* some text 2 */
ACTION : /* some text 2 in multiple lines */
.
.
.

这种情况继续下去。 我想使用sed或awk工具替换从COMMAND开始直到其对应的ACTION(即在下一个COMMAND之前)与另一个文本的文本。

因此,如果我想删除带有一些文本的第一个COMMAND-ACTION组,则结果如下。

USED SED/AWK HERE
COMMAND : /* some text 2 */
ACTION : /* some text 2 in multiple lines */
.
.
.

5 个答案:

答案 0 :(得分:1)

所有命令/选项的通用

sed '/COMMAND/,/ACTION/ {
   /COMMAND/ i\
Put your new text \
and lines here
   d
   }' YourFile

具体取决于您的Command文本内容

SearchText='your pattern search text (reduce regex format)"

sed "/COMMAND.*${SearchText}/,/ACTION/ {
   /COMMAND/ i\
Put your new text \
and lines here
   d
   }" YourFile

答案 1 :(得分:1)

Upvoted:

sed '/COMMAND/,/ACTION/ {
/COMMAND/ i\
Put your new text \
and lines here
d
}' YourFile

使用awk(真的是nawk或gawk,awk没用)你可以这样做:

replace='myReplaceBlockLine1\nmyReplaceBlockLine2'
nawk '/COMMAND/,/ACTION/{ myvar=replace; gsub(/\\n/,"\n",myvar); print myvar; next} 1'
 "replace=$replace" input_file.txt

两者都有缺点 - 没有反向支持。 awk的好处 - 你可以添加一些逻辑,比如只替换第一次出现或删除重复

答案 2 :(得分:0)

使用它:

sed ':a;N;$!ba;s/\nACTION/ ACTION/g' | sed 's/ACTION.*$/MY_TEXT/g'

答案 3 :(得分:0)

您可以像这样使用awk,并将替换文字放在名为repl.txt的文件中:

awk '/^COMMAND x/{del=1;print;system("cat repl.txt");next} {if(!del)print} /^ACTION/{del=0}' file

基本上,当它找到你要找的COMMAND时,它会设置del cariable,因此它知道要删除该动作,并打印COMMAND并包含来自的文本文件repo.txt。然后删除它看到的任何行,直到它在停止删除时看到以ACTION开头的行。

COMMAND x是您正在寻找的特定命令。

或者你可以直接把替换文字放在awk中:

awk '/^COMMAND x/{del=1;print;print "Replacement text";next} {if(!del)print} /^ACTION/{del=0}' file

答案 4 :(得分:0)

GNU awk(由于RS)应跳过第一组

awk -v RS="COMMAND :" 'NR>2 {print RS$0}' file
COMMAND : /* some text 2 */
ACTION : /* some text 2 in multiple lines */

或者你的意思是:

awk -v RS="COMMAND :" 'NR>1{$0=RS $0} NR==2 {$0="New text"}1' file

New text
COMMAND : /* some text 2 */
ACTION : /* some text 2 in multiple lines */