这是来自文件的片段:
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 */
.
.
.
答案 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 */