如何使用 grep/sed/awk,从文本文件的开头删除模式



我有一个文本文件,上面写着以下模式:

TIME[32.468ms]  -(3)-............."TEXT I WANT TO KEEP"

我想丢弃每行的第一部分,

其中包含
TIME[32.468ms]  -(3)-.............

为了测试正则表达式,我尝试了以下方法:

cat myfile.txt | egrep "^TIME[.*]ss-(3)-.+"

这样可以正确识别我想要的行。现在,要删除我尝试过的模式:

cat myfile.txt | sed s/"^TIME[.*]ss-(3)-.+"//

但它似乎只是在做cat,因为它显示了完整文件的内容并且没有发生替换。

我做错了什么?

操作系统: CentOS 7

使用您显示的示例,请尝试按照grep命令进行操作。使用 GNUgrep编写和测试。

grep -oP '^TIME[d+.d+ms]s+-(d+)-.+K.*' Input_file

说明:为上述代码添加详细说明。

^TIME[          ##Matching string TIME from starting of value here.
d+.d+ms]     ##Matching digits(1 or more occurrences) followed by dot digits(1 or more occurrences) followed by ms ] here.
s+-(d+)-.+  ##Matching spaces91 or more occurrences) followed by - digits(1 or more occurrences) - and 1 or more dots.
K               ##Using K option of GNU grep to make sure previous match is found in line but don't consider it in printing, print next matched regex part only.
.*               ##to match till end of the value.


第二个解决方案:在此处添加awk程序。

awk 'match($0,/^TIME[[0-9]+.[0-9]+ms][[:space:]]+-([0-9]+)-.+/){print substr($0,RSTART+RLENGTH)}' Input_file

说明:使用awkmatch函数来匹配正则表达式^TIME[[0-9]+.[0-9]+ms][[:space:]]+-([0-9]+)-.+,这将捕获我们实际上想要从行中删除的文本。然后打印除OP实际需要的匹配文本之外的其余文本。

awk使用其sub()函数:

awk 'sub(/^TIME[[][^]]*].*.+/,"")' file
"TEXT I WANT TO KEEP"
  • 如果有替换,则sub()返回 true。
$ cut -d'"' -f2 file
TEXT I WANT TO KEEP

您可以使用:

s='TIME[32.468ms]  -(3)-............."TEXT I WANT TO KEEP"'
sed -E 's/^TIME[[^]]*].*.+//'
"TEXT I WANT TO KEEP"

您的sed可能不支持s正则表达式扩展。

在 BRE 语法中(这是sed开箱即用的),您不会反斜杠圆括号 - 这样做会将它们变成与自身不匹配的正则表达式元字符,有点不直观。 此外,+只是 BRE 中的一个常规字符,而不是重复运算符(尽管您可以通过类似的反斜杠将其转换为一个字符:+)。

您可以尝试添加一个-E选项,从 BRE 语法切换到可能更熟悉的 ERE 语法,但这仍然不会启用 Perl 正则表达式扩展,它们也不是 ERE 语法的一部分。

sed 's/^TIME[[^][]*][[:space:]][[:space:]]-(3)-.*//' myfile.txt

应该适用于任何合理的 POSIXsed.(另请注意减号字符不需要反斜杠转义,尽管这样做本身是无害的。此外,我收紧了方括号的正则表达式,以防止您.*的"匹配任何内容"正则表达式"转义"通过右方括号。更详细地说,[^][]是一个否定字符类,它匹配任何不是(换行符或)][的字符;必须按此顺序精确指定它们,以避免字符类定义中的歧义。最后,还要注意整个sed脚本通常应该如何用单引号引用,除非您有特定原因使用不同的引用。

如果您有sed -Esed -r您可以使用+而不是*但这会使整个正则表达式复杂化,所以我不会在这里建议这样做。

一个更简单的sed

sed 's/^[^"]*//' myfile.txt

如果"您要保留的文本"总是像这样被引号包围,并且只有它们在以"TIME...",那么:

sed -n '/^TIME/p' file | awk -F'"' '{print $2}'

应该让行以"时间..."并打印引号内的文本。

谢谢大家的帮助。 到最后,我找到了一种使其工作的方法:

echo 'TIME[32.468ms] -(3)-.............TEXT I WANT TO KEEP' | grep TIME | sed -r 's/^TIME[[0-9]+.[0-9]+ms]ss-(3)-.+//'

更一般地说,

grep TIME myfile.txt | sed -r ‘s/^TIME[[0-9]+.[0-9]+ms]ss-(3)-.+//’干杯 佩德罗

最新更新