使用 sed 来计算句点、逗号和数字?

Use sed to count periods, commas, and numbers?

我有一个如下所示的文件:

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地址,用逗号隔开。所以,每一行都应该满足这些要求:

如果一行缺少一个句点、more/less 个逗号、一个字母、空白或类似的任何内容 - 这是不正确的。基本上我只想使用 sed 或类似的东西来遍历文件中的每一行,并确保每一行都满足上述要求。

这可以用 sed 完成吗?我知道您可以使用它来删除 do/don 没有匹配字符串的文件,但我不确定是否要计算特定字符数或验证某行是否仅包含特定字符。

如有任何帮助,我们将不胜感激。谢谢!

我要做的是想出一个适合 'proper' 行的正则表达式,并在打印时忽略它们。像这样:

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 输出匹配这个正则表达式的所有行。

我认为 grep 是一个更好的工具。您只想确保每一行都与特定的正则表达式匹配,因此使用 -v 反转 grep 并在输出任何行时将输入标记为无效。类似于:

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

如果您只想显示有关文件内容正确性的信息,可以使用此命令:

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 答案的修改版本,但只显示信息文本:

  • 文件不正确,或者
  • 文件正常。