我有一个文件(data.txt),其中包含如下字符串:
[?1h=
=> ["AD070517",
"AD070518",
: ESCESCOOBB "AD070809",
"NE0000013",
"NE0000014",
: ESCESC[[66~~ "LG100085-097",
"LG100085-098",
]
我尝试使用以下命令仅从数组中提取条目(减去双引号):
sed -r 's/([-A-Z0-9]+)"/\1/g' data.txt > clean.txt
根据这个正则表达式片段,对照组和比赛按预期进行,据我了解这个帖子我应该能够仅输出 sed 中的匹配项并将输出流定向到新文件,但生成的 clean.txt 文件是 data.txt 的精确副本,没有任何内容被过滤掉。
答案1
您的sed
命令不应仅输出匹配项。
s/pattern/replacement/g
只是用替换件替换了图案,其他一切都保持不变。
实际上,输出不应该是精确的副本,而是"
模式被删除后的副本。
您可能想使用grep
grep -Eo '[-A-Z0-9]+"' data.txt | sed 's/"$//' > clean.txt
或者
grep -Po '[-A-Z0-9]+(?=")' data.txt > clean.txt
答案2
使用 -n 仅显示匹配的行。
sed -n -r 's/([-A-Z0-9]+)"/\1/g' data.txt > clean.txt
对于第二个问题,将不需要的东西替换为空:
sed -n -r 's/^.*"([-A-Z0-9]+)".*/\1/g' data.txt > clean.txt
答案3
您可以告诉 sed 仅在替换成功时才打印。使用该t
命令:它会转到指定的标签(如果有)。b
跳过其余代码,p
打印替换的行。
sed -n -r 's/.*"([-A-Z0-9]+)".*/\1/g;t a;b;:a p'
我必须在最后两行添加两个缺失的双引号。
使用 Perl 可能更具可读性:
perl -lne 'print $1 if /([-A-Z0-9]+)"/'