我需要查找并替换文件中字符串中的一个或两个数字字符。这些字符串是以下形式的 IP 地址:
10.xx.y.z
其中xx
可以是一两个字符。
我想xx
用单个字符替换0
,所以我有
10.0.y.z
y
保留和的值z
。
该字符串可能在文件中出现多次。sed
执行此操作的调用是什么?
答案1
n=[:digit:] o="[$n]\{1,3\}\."
sed -e"s/^/ /" \
-e"s/\([^.$n]$o\)$o\($o${o%.})/\10.\2/g" \
-e"s/.//" \
<in >out
它不将八位字节限制为 8 位,也不将最后一个八位字节限制为三位数字,但它可能已经足够好了。
如果您想就地编辑文件,最好的这样做的方法(而不是使用通常危险的-i
开关 forperl
或 some sed
s)是首先获取文件的临时副本,对其进行编辑,然后将编辑后的临时副本写回原始文件。大多数贝壳(包括bash
和zsh
)当您请求此处文档时,将自动为您提供一个安全的临时文件:
sed -e"#...script..." \
<<IN >infile
$(cat <infile)
IN
以上将删除所有尾随空白行infile
如果有的话,但本网站上还有许多其他答案,这些答案也演示了如何保存这些答案(如果您需要的话)。它也不处理空字节,如果没有zsh
.
答案2
假设(如指定)文件由字符串组成,并且字符串是知识产权
每条线路 1 个 IP
sed 's/.[^.]*/0/' YourFile
每条线路有多个IP
sed 's/\([0-9]\{1,3\}[.]\)[^.]*\(\([.][[:alnum:]]\{1,\}\)\{2\}\)/\1.0\2/g' YourFile
答案3
这有效:
o="[[:digit:]]\{1,3\}"
sed -e"s/10\.$o\.\($o\.$o\)/10.0.\1/g" <input.txt >output.txt
在文件中的任意位置将 10.Xyz 修改为 10.0.yz,甚至在同一行上多次修改。根本不会与任意 WWW.xyz 字符串混淆。