我有一个文本文件,上面写着以下模式:
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
说明:使用awk
match
函数来匹配正则表达式^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 -E
或sed -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)-.+//’
干杯 佩德罗