jedi Asked: 2022-04-04 08:38:04 +0800 CST2022-04-04 08:38:04 +0800 CST 2022-04-04 08:38:04 +0800 CST Grep 用于出现一次感叹号的文本行 772 假设我有一个包含以下内容的文件: some:text:!someothertext another:text:!!anothertext 我只想对仅出现一次“!”的文本行进行 grep 这就是我所拥有的,它似乎有效,但想知道是否有更好的方法。 grep -E ':![^!]' my_tex.txt linux grep 4 个回答 Voted Kusalananda 2022-04-04T08:57:15+08:002022-04-04T08:57:15+08:00 以下用途awk及其gsub()计算每行感叹号的数量。该命令将仅输出恰好包含一个感叹号的行。将&匹配的感叹号替换为自身。 awk 'gsub("!","&") == 1' file 您可以使用 Perl 及其tr运算符执行类似的操作: perl -ne 'print if tr /!/!/ == 1' file grep您可以按以下方式进行操作,从而避免试图变得聪明: grep -F '!' file | grep -v '!.*!' 即提取包含单个感叹号的行,然后删除包含多个感叹号的行。它涉及两个grep命令的管道,但很清楚管道正在做什么,这在许多情况下可能很有价值。grep如果您想grep -v -F '!!'避免使用特定的子字符串但!!仍然允许诸如!hello!. DanieleGrassini 2022-04-04T13:00:53+08:002022-04-04T13:00:53+08:00 我会使用sed: sed 's/!/!/2;t1;/!/p;:1 d' file 或以多线便携方式: sed ' s/!/!/2;t1 /!/p;:1 d ' file 或者禁用行打印可以更短: sed -n 's/!/!/2;t;/!/p' file 使用GNU sedandT命令来检查一个替换是否失败: sed '/!/!d;s/!/!/2;T;d' file 这些都一样:尝试替换该!行中的第二次出现。如果替换成功(用 测试t),则该行中至少有两个!,因此跳过它。 Praveen Kumar BS 2022-04-04T21:02:35+08:002022-04-04T21:02:35+08:00 awk -F '!' 'NF==2' filename 输出 some:text:!someothertext Best Answer steeldriver 2022-04-04T08:43:28+08:002022-04-04T08:43:28+08:00 也许你想要的是一个由 ! 组成的整行匹配。被零个或多个非包围!字符 - 要么 grep -x '[^!]*![^!]*' my_tex.txt 或者 grep '^[^!]*![^!]*$' my_tex.txt
以下用途
awk
及其gsub()
计算每行感叹号的数量。该命令将仅输出恰好包含一个感叹号的行。将&
匹配的感叹号替换为自身。您可以使用 Perl 及其
tr
运算符执行类似的操作:grep
您可以按以下方式进行操作,从而避免试图变得聪明:即提取包含单个感叹号的行,然后删除包含多个感叹号的行。它涉及两个
grep
命令的管道,但很清楚管道正在做什么,这在许多情况下可能很有价值。grep
如果您想grep -v -F '!!'
避免使用特定的子字符串但!!
仍然允许诸如!hello!
.我会使用
sed
:或以多线便携方式:
或者禁用行打印可以更短:
使用
GNU sed
andT
命令来检查一个替换是否失败:这些都一样:尝试替换该
!
行中的第二次出现。如果替换成功(用 测试t
),则该行中至少有两个!
,因此跳过它。输出
也许你想要的是一个由 ! 组成的整行匹配。被零个或多个非包围!字符 - 要么
或者