我有一个看起来像这样的文件:
19.217.179.33,175.176.12.8
253.149.205.57,174.210.221.195
222.118.178.218,255.99.100.202
241.55.199.243,167.98.204.104
38.224.198.117,21.11.184.68
每行是2个IP地址,用逗号分隔。因此,每一行都应满足这些要求:
如果一行缺少句号,有多于/少于一个逗号,有一个字母,是空白,或类似的东西 - 它是不正确的。基本上我只想使用sed
或类似的东西循环遍历文件中的每一行,并确保每一行符合上述要求。
这可以通过sed
完成吗?我知道你可以用它来删除没有匹配字符串的文件,但我不确定是否计算特定字符或验证某行只有某些字符。
非常感谢任何帮助。谢谢!
答案 0 :(得分:2)
我认为grep
是一个更好的工具。您只想确保每一行与特定正则表达式匹配,因此将grep与-v
反转,如果输出任何行,则将输入标记为无效。类似的东西:
grep -qvE '^([0-9]{1,3}\.){3}[0-9]{1,3},([0-9]{1,3}\.){3}[0-9]{1,3}$' input || echo input is valid
您可以简化一下:
IP='([0-9]{1,3}\.){3}[0-9]{1,3}'
grep -qvE "^$IP,$IP$" input || echo input is valid
或者如果您对无效数据更感兴趣:
grep -qvE "^$IP,$IP$" input && echo input is invalid
答案 1 :(得分:1)
我要做的是想出一个适合“正确”的正则表达式。线条,并从打印中省略它们。像这样:
sed -r '/^([0-9]{1,3}\.){3}[0-9]{1,3},([0-9]{1,3}\.){3}[0-9]{1,3}$/d' file
剩下的一切都是错误的。
这里有更详细的食谱:
[0-9]{1,3}
介于一位和三位之间\.
字面句点(只是句点是通配符并匹配任何字符)(...){3}
三次重复的事情,所以一起([0-9]{1,3}\.){3}[0-9]{1,3}
组成了一个看起来像IP地址的东西。 (虽然请注意,它并未强制执行< 256规则,因此999.999.999.999
匹配。)/^ ... $/
匹配需要从行的开头开始并一直运行直到结束。'/ ... /d'
打印除了与两条斜线内的内容匹配的行以外的所有内容-r
来识别{1,3}
语法。这将找到并打印错误的行。如果要删除错误的行,可以轻松反转:
sed -i.bak -n -r '/^([0-9]{1,3}\.){3}[0-9]{1,3},([0-9]{1,3}\.){3}[0-9]{1,3}$/p' file
-i.bak
表示保留备份,但会覆盖输入文件-n
表示除非明确指示输出,否则不输出任何内容,/ ... /p
输出与此正则表达式匹配的所有行。答案 2 :(得分:0)
如果您只想显示有关文件内容正确性的信息,可以使用以下命令:
sed -n -r '/^([0-9]{1,3}\.){3}[0-9]{1,3},([0-9]{1,3}\.){3}[0-9]{1,3}$/!{a \
FILE IS INCORRECT
;q;};$aFILE IS OK'
它的@ chw21答案的修改版本,但只显示信息文本: