我在 ubuntu 中有这个输入文件:
146.14.142.96.17747 197.102.40.184.13748:
146.14.142.96.17747 197.102.40.184.13749:
146.14.142.96.17747 197.102.40.184.13750:
146.114.142.96.17747 197.102.40.184.13751:
46.14.142.96.17747 197.102.40.184.13752:
并且我希望使用 shell 脚本获得如下输出:
分隔两个 IP,不带端口号,即删除端口
146.14.142.96 197.102.40.184
146.14.142.96 197.102.40.184
146.14.142.96 197.102.40.184
146.114.142.96 197.102.40.184
46.14.142.96 197.102.40.184
答案1
对于格式与问题中所示完全一致的行,可以这样做:
sed -E 's/\.[0-9]+[ :]/ /g' input-file
怎么运行的:
这
-E
使扩展正则表达式。s/SEARCH/REPLACE/g
全局 (/g
) 替换 (s/
)搜索和代替。\.[0-9]+[ :]
匹配空格或冒号后任意正数位数字后面的点。
但是,只要格式稍有变化,这种方法就会失效。这种方法可能会更稳健:
sed -E 's/(([0-9]+\.){3}[0-9]+)[^ ]+/\1/g' input-file
怎么运行的:
([0-9]+\.){3}[0-9]+
匹配一个 IP(三位数字组后跟点加上一个额外的数字组)。周围的括号将前一个匹配声明为第一个子匹配(
\1
)。[^ ]+
匹配 IP 后面的任何非空格字符。
答案2
使用正则表达式进行搜索和替换
(\d+\.\d+\.\d+\.\d+)\.\d+(:?)
并替换文本
\1
各种工具都支持正则表达式搜索和替换,尽管方言可能略有不同。以上适用于 Notepad++。
或者在 vim 中你可以这样做
:s/\(\d\+\.\d\+\.\d\+\.\d\+\)\.\d\+\(:\?\)/\1/g