使用 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地址,用逗号隔开。所以,每一行都应该满足这些要求:
- 有 1 个逗号。
- 有 6 个时期。
- 只有数字、逗号和句号。
如果一行缺少一个句点、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 答案的修改版本,但只显示信息文本:
- 文件不正确,或者
- 文件正常。
我有一个如下所示的文件:
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 个时期。
- 只有数字、逗号和句号。
如果一行缺少一个句点、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 答案的修改版本,但只显示信息文本:
- 文件不正确,或者
- 文件正常。