我有一个这样的文件,每行包含(
和)
对:
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).
如何删除文件中括号内的字符太少或太多的任何行?
答案 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