如何从BASH中括号内少于5个字符和10个以上字符的文件中删除行?

时间:2014-02-22 09:05:29

标签: bash sed awk grep

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

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个字符的所有行{1}}。上述示例的输出如下所示:

)
  • 每行至少有一组括号。
  • 括号组不会跨越各行。
  • 括号内的任何符号(包括空格)都可以算作字符。

这些是我迄今为止所拥有的:

This is another sentence (a note).

如何删除文件中括号内的字符太少或太多的任何行?

5 个答案:

答案 0 :(得分:3)

这将使所有行在括号之间保留5-10个字符,并删除所有其他行。

egrep '\(.{5,10}\)' file.txt

答案 1 :(得分:2)

您可以尝试此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).

答案 2 :(得分:1)

您可以使用此

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

第二个示例将添加到现有文件或根据需要创建新文件。

你也可以使用egrep而不是grep(如果你这样做,你就不需要-P选项

这样做是使用正则表达式搜索认为他的文件和程序grep和egrep将打印与提供的正则表达式匹配的每一行。在这种情况下,正则表达式为"\(.{5,10}\)"反斜杠表示下一个字符是文字​​字符,因此当后跟一个(或a)时,你会说一个文字'('而不是它通常在常规中表示的内容表达式。“。”表示除换行符之外的任何字符{}表示最后一个字符的有限数量的重复(在这种情况下可以是任何字符),里面的数字是min和max,用逗号分隔。

所以基本上说grep打印出任何一行,其中包含一个包含开括号模式的字符串,然后是5到10个不是换行符后跟一个右括号的字符。

您可以在此处获取有关正则表达式字符串的更多信息 http://www.regular-expressions.info/

答案 3 :(得分:1)

你可以使用awk。括号之间有五到十个字符

awk  '/\(.{5,10}\)/'  filename.txt

或左括号后的五到十个非右副词

awk  '/\([^)]{5,10}\)/'  filename.txt

答案 4 :(得分:1)

您无法分配两个这样的字段分隔符。修改您的awk解决方案:

awk -F"[()]" 'length($2)>5 && length($2)<10’ file.txt