如何删除一行到特定字符模式的单词...正则表达式

Man*_*hah 1 regex bash sed

我想要从文件中的一行"测试"单词之后的单词.意思是在实际上,我不希望在"测试"字之前出现这些词.

这就是模式......

例如:

输入:

***This is a*** test page.

***My*** test work of test is complete.
Run Code Online (Sandbox Code Playgroud)

输出:

test page.

work of test is complete.
Run Code Online (Sandbox Code Playgroud)

per*_*eal 12

使用sed:

sed -n 's/^.*test/test/p' input
Run Code Online (Sandbox Code Playgroud)

如果要打印不匹配的行,请不要触摸:

sed 's/^.*test/test/' input
Run Code Online (Sandbox Code Playgroud)

上面的一个将删除(贪婪)所有文本,直到最后test一行.如果你想删除第一个测试使用potong的建议:

sed -n 's/test/&\n/;s/.*\n//p' input
Run Code Online (Sandbox Code Playgroud)

  • @perreal`.*test`是贪婪的,并且会发现最长的匹配不一定是第一个.为了保证第一次匹配,应该使用`s/test /&\n /; s /.*\n //`.注意我已经使用`\n`作为设置标记的唯一字符,但是一个独特的短语也可以. (2认同)

Tru*_*ueY 5

单线:

while read x; do [[ $x =~ test.* ]] && echo ${BASH_REMATCH[0]}; done <infile
Run Code Online (Sandbox Code Playgroud)

输入:infile

This is a test page.
My test work of test is complete.
Run Code Online (Sandbox Code Playgroud)

输出:

test page.
test work of test is complete.
Run Code Online (Sandbox Code Playgroud)

它从file读取所有行infile,检查该行是否包含字符串test,然后打印该行的其余部分(包括test)。

相同的

sed的/。(test。)/ \ 1 /'infile(糟糕!这是错误的!.*是贪婪的,因此它从第二示例行中切得太多)。这很好用:

sed -e 's/\(test.*\)/\x03&/' -e 's/.*\x03//' infile
Run Code Online (Sandbox Code Playgroud)

我做了一些速度测试(针对原始(错误的)版本)。结果是对于小型文件,解决方案的性能更好。对于较大的文件,更好。我还尝试了这个版本,它对于大文件来说更好:

awk 'match($0,"test.*"){print substr($0,RSTART)}' infile
Run Code Online (Sandbox Code Playgroud)

类似:

perl -ne 's/(.*?)(test.*)/$2/ and print' infile
Run Code Online (Sandbox Code Playgroud)

我使用了两行示例输入文件,每次都将其复制一次。每个版本运行1000次。结果是:

  Size |  bash  |  sed   |  awk   |  perl
   [B] |  [sec] |  [sec] |  [sec] |  [sec]
------------------------------------------
    55 |  0.420 | 10.510 | 10.900 | 17.911
   110 |  0.460 | 10.491 | 10.761 | 17.901
   220 |  0.800 | 10.451 | 10.730 | 17.901
   440 |  1.780 | 10.511 | 10.741 | 17.871
   880 |  4.030 | 10.671 | 10.771 | 17.951
  1760 |  8.600 | 10.901 | 10.840 | 18.011
  3520 | 17.691 | 11.460 | 10.991 | 18.181
  7040 | 36.042 | 12.401 | 11.300 | 18.491
 14080 | 72.355 | 14.461 | 11.861 | 19.161
 28160 |145.950 | 18.621 | 12.981 | 20.451
 56320 |        |        | 15.132 | 23.022
112640 |        |        | 19.763 | 28.402
225280 |        |        | 29.113 | 39.203
450560 |        |        | 47.634 | 60.652
901120 |        |        | 85.047 |103.997  
Run Code Online (Sandbox Code Playgroud)