Grep 查找出现一次感叹号的文本行

Grep 查找出现一次感叹号的文本行

假设我有一个包含以下内容的文件:

some:text:!someothertext
another:text:!!anothertext

我只想对仅出现一次 '!' 的文本行进行 grep

这就是我所拥有的,它似乎有效,但想知道是否有更好的方法。

grep -E ':![^!]' my_tex.txt

答案1

下面使用awkand itgsub()来统计每行感叹号的数量。该命令将仅输出恰好包含一个感叹号的行。&将匹配的感叹号替换为其自身。

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!

答案2

我会用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至少有两个,因此跳过它。!

答案3

awk -F '!' 'NF==2' filename

输出

some:text:!someothertext

答案4

也许你想要的是一个整行匹配它由一个 !周围有零个或多个非!字符 - 任一

grep -x '[^!]*![^!]*' my_tex.txt

或者

grep '^[^!]*![^!]*$' my_tex.txt

相关内容