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

时间:2016-12-08 05:31:20

标签: bash shell sed command-line command

我有一个看起来像这样的文件:

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

  • 有1个逗号。
  • 有6个时期。
  • 只有号码,逗号和句号。

如果一行缺少句号,有多于/少于一个逗号,有一个字母,是空白,或类似的东西 - 它是不正确的。基本上我只想使用sed或类似的东西循环遍历文件中的每一行,并确保每一行符合上述要求。

这可以通过sed完成吗?我知道你可以用它来删除没有匹配字符串的文件,但我不确定是否计算特定字符或验证某行只有某些字符。

非常感谢任何帮助。谢谢!

3 个答案:

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

  • 文件不正确,或
  • 文件没问题。