2016-06-18 76 views
0

我想打开一个包含500个IP地址列表的文本文件。我想对其中一行进行以下更改并保存该文件。用awk或sed可以做到这一点吗?awk替换文本文件中的一行并保存它

当前行:

100.72.78.46:1900

变化:

100.72.78.46:1800

+2

可能的复制[如何用sed替换整行?](http://stackoverflow.com/questions/8822097/how-to-replace-whole-line-with-sed) – hek2mgl

+0

答案是否有可能做到这一点与awk“有关操纵文本的问题是”是“。请阅读[问]。 –

回答

0

可以实现与以下:

sed -ie 's/100.72.78.46:1900/100.72.78.46:1800/' file.txt 

i选项将更新原始文件,并且a备份文件将被创建。这将只编辑模式的第一次出现。如果要替换所有匹配的模式,但是添加g最后/

该解决方案后,(如上的评论点出)无法在其他许多情况下,如72100372578146:190032,这将转化为72100.72.78.46:180032

为了避免这一点,你必须做一个精确匹配,也没有对待.特殊字符(见here):

sed -ie 's/\<100\.72\.78\.46:1900\>/100.72.78.46:1800/g' file.txt 

注意\.\<...\>“字边界“完全匹配的符号。这个解决方案在Linux机器上为我工作,但不在MAC上。对于这一点,你将不得不使用一个稍微不同的语法(见here):

sed -ie 's/[[:<:]]100\.72\.78\.46:1900[[:>:]]/100.72.78.46:1800/g' file.txt 

其中[[:<:]]...[[:>:]]会给你确切的匹配。

最后,我也意识到,如果你有每行只有一个IP地址,你也可以使用特殊字符^$为始和行末,防止错误的更换:

sed -ie 's/^100\.72\.78\.46:1900$/100.72.78.46:1800/g' file.txt 
+0

这会因各种输入文件内容而失败。例如它会将'72100372578146:190032'转换为'72100.72.78.46:180032'。找到/更改想要的文本总是很容易,但要找到/更改不想要的文本会更困难,并且只需输入一些小的样本输入即可生成输出结果的脚本是找到解决方案的起点,而不是终点。在发布样本输入/输出时,务必考虑一些您认为可能难以处理且不希望发现/更改的案例,而不仅仅是一个晴天案例。 –

+1

是的,你是对的。我会编辑我的回复,使其更具有普遍意义。谢谢! –

相关问题