如何从BASH中括号内字符少于5个且多于10个的文件中删除行



我有一个这样的文件,每行包含成对的()

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

相关内容

  • 没有找到相关文章

最新更新