我只是想做到以下替代多个线条图案在sed
inputfile中更换
EXTRATHING {
};
通过
SOMETHING {};
。为此,我尝试了
sed -e 's/EXTRATHING {\n};/SOMETHING/' input_file.txt >outfile.txt
这不起作用。有人可以建议用sed做这件事的正确方法是什么?
我只是想做到以下替代多个线条图案在sed
inputfile中更换
EXTRATHING {
};
通过
SOMETHING {};
。为此,我尝试了
sed -e 's/EXTRATHING {\n};/SOMETHING/' input_file.txt >outfile.txt
这不起作用。有人可以建议用sed做这件事的正确方法是什么?
sed -n '1h;1!H;${;g;s/EXTRATHING {\n};/SOMETHING {};/g;p;}' input_file.txt
会这样做。
问题在于它将整个输入字符串存储在sed的缓冲区中。
有关更多信息和更高效的版本,请参阅sed and Multi-Line Search and Replace。
这可能会为你工作:
sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file.txt >output_file.txt
,或者如果你想编辑原始文件:
sed -i '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file
编辑:这里要求是一个例子:
cat <<! | sed '/^EXTRATHING {/,/^};/c\SOMETHING{}'
> aaa
> EXTRATHING {
> };
> bbb
> EXTRATHING {
> };
> ccc
> !
aaa
SOMETHING{}
bbb
SOMETHING{}
ccc
编辑:如果第一个和最后一个地址是连续的行,请使用:
# cat <<\! | sed '/^EXTRATHING {/{N;s/^EXTRATHING {\n};/SOMETHING{}/}'
> aaa
> EXTRATHING {
> bbb
> };
> ccc
> EXTRATHING {
> };
> ddd
> !
aaa
EXTRATHING {
bbb
};
ccc
SOMETHING{}
ddd
另一种方式(也许是更容易?):
echo -e "EXTRATHING {\n};" | sed '$!N;s/^EXTRATHING {\n};/SOMETHING {};/;P;D'
SOMETHING {};
sed -i.bak '/EXTRATHING/{N;s//SOMETHING/;s/\n//}' input_file.txt
perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' your_file
如下测试:
> cat temp
fjbwjfbw
wefjkbwjk
jbefwejr
EXTRATHING {
};
ghekg
jhgjk
wefjkwngk
EXTRATHING {
};
jbgvjnrg
jbfw
wefnkwk
EXTRATHING {
};
> perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' temp
fjbwjfbw
wefjkbwjk
jbefwejr
SOMETHING{};
ghekg
jhgjk
wefjkwngk
SOMETHING{};
jbgvjnrg
jbfw
wefnkwk
SOMETHING{};
>
如果要更改文件内嵌
。添加一个-i标志。 like:
perl -i -lne '.......' your_file
它很难在sed中做到,需要写下标。 但是,您可以用perl用一行代码:
perl -0777 -pe 's/EXTRATHING {\n/SOMETHING {/g' input_file.txt > outfile.txt
其中 -0777是记录分隔符(在文本文件底线) -p所有文件并打印在屏幕上运行命令 -e说,它的一个在线命令
小心发布你的例子,这个工程;-)?我刚刚得到原始文档返回..祝你好运。 – shellter
谢谢@potong。但是,如果在“EXTRATHING {”和“};”之间还有一些其他行,则您的命令也会删除原始模式。我不希望这些被替换。因此,下列内容不应被替换为“EXTRATHING {\ n something \ n};”。 – bbv
谢谢,我看到你的代码和sed 4 *一起工作,但是没有UWIN中的unversion版本。你使用范围表达式来捕捉两条线吗?即'/ x /,/ y /'?祝你们好运。 – shellter