我有一个这样的文件,每行包含成对的(
和)
:
This is a sentence (1).
This is another sentence (a note).
This is a sentence (2).
This is another sentence (with another, longer note).
我需要删除(
和)
之间少于5个字符的任何行,以及(
和)
之间超过10个字符的所有行。上述样本的输出如下所示:
This is another sentence (a note).
- 每行的括号永远不会超过一组
- 括号组从不换行
- 括号内的任何符号(包括空格)都可以算作一个字符
这些是我到目前为止所拥有的:
grep ([w{5},w{10}]) file.txt
awk -F( -F) 'length($2)>5' 'length($2)<10' file.txt
如何删除文件中括号内字符过少或过多的行?
这将保留括号之间有5-10个字符的所有行,并删除所有其他行。
egrep '(.{5,10})' file.txt
你可以试试这个sed
,
sed '/(.{10,})|(.{,5})/d' file.txt
sed -n '/(.{5,10})/p' file.txt
测试:
sat:~# sed '/(.{10,})|(.{,5})/d' file.txt
This is another sentence (a note).
您可以使用此
grep -P "(.{5,10})" filename.txt
如果您想将结果设置为一个变量,那么您可以使用它。
var=$( grep -P "(.{5,10})" filename.txt )
或
var=` grep -P "(.{5,10})" filename.txt `
您应该注意,在第二个示例中,它使用的是反引号,而不是单引号。如果你想将输出打印到文件中,那么你可以使用
grep -P "(.{5,10})" filename.txt > newfile.txt
或
grep -P "(.{5,10})" filename.txt >> newfile.txt
如果需要,第二个示例将添加到现有文件或创建新文件。
你也可以使用egrp而不是grep(如果你这样做了,那么你就不需要-p选项
这是使用正则表达式搜索,以为文件和程序grep和egrp将打印与所提供的正则表达式匹配的每一行。在这种情况下,正则表达式是"(.{5,10})"
。反斜杠意味着下一个字符是一个文字字符,所以当后面跟一个(或a)时,你说的是文字"(",而不是它在正则表达式中通常表示的。"."意味着除换行符之外的任何字符,{}表示最后一个字符(在这种情况中,它将是任何字符)的有限重复次数,并且里面的数字是最小值和最大值,用逗号分隔。
所以我们基本上是说grep打印出任何一行,如果它有一个包含左括号模式的字符串,然后是5到10个不是换行符的字符,后面跟着一个右括号。
您可以在此处获得有关regex字符串的更多信息http://www.regular-expressions.info/
您可以使用awk。括号之间有五到十个字符
awk '/(.{5,10})/' filename.txt
或左括号后五到十个非右括号
awk '/([^)]{5,10})/' filename.txt
不能像那样分配两个字段分隔符。修改awk
解决方案:
awk -F"[()]" 'length($2)>5 && length($2)<10’ file.txt