如何删除文件中以特定字符串(在本例中为字符串“end”)开头的所有单词,以便:
<region> sample=PDL UP IN-A-1.flac lokey=21 hikey=21 lovel=0 hivel=21 end=423471 pitch_keycenter=21
<region> sample=PDL UP IN-A-1_0001.flac lokey=21 hikey=21 lovel=22 hivel=42 end=370196 pitch_keycenter=21
<region> sample=PDL UP IN-A-1_0002.flac lokey=21 hikey=21 lovel=43 hivel=63 end=362268 pitch_keycenter=21
变成:
<region> sample=PDL UP IN-A-1.flac lokey=21 hikey=21 lovel=0 hivel=21 pitch_keycenter=21
<region> sample=PDL UP IN-A-1_0001.flac lokey=21 hikey=21 lovel=22 hivel=42 pitch_keycenter=21
<region> sample=PDL UP IN-A-1_0002.flac lokey=21 hikey=21 lovel=43 hivel=63 pitch_keycenter=21
使用命令行
我试过:
sed 's/\S*\(end\|END\)\S*//g' file.txt
但它没有起作用。
谢谢。
答案1
您已经非常接近了。您缺少的最大功能是启用扩展正则表达式。
其次,匹配项开头有“\S*”。这实际上没有任何作用,因为它允许在除空格之外的任何位置进行“一或零”次匹配。由于“end”始终以空格开头,因此永远不会使用它。我相信您的意思是“end”是单词的开头,即“<”字符。
这是一个工作版本:
sed -E 's/\<(end|END)\S*//g' file.txt
但可以稍微改进一下。在这里,我让匹配不区分大小写,以删除单词上的“或”,从而消除了对扩展正则表达式的需求。我还添加了尾随的“\s”以删除尾随空格(防止间隙中出现双空格)。
sed 's/\<END\S*\s//gi' file.txt
更新
根据您下面的评论,似乎我们都误解了您想要什么。听起来您不仅想删除这些文本字段,还想在文件本身中这样做。虽然我为没有提到这一点而道歉,但这是一个很好的教训,说明为什么措辞您的问题以准确询问您想要什么如此重要。
无论如何,您的解决方案(添加 > file.txt)实际上会用新文本覆盖旧文件。具体来说,sed 会将结果输出到 stdout(您的终端)。“>”符号称为重定向。它会将前面的 stdout 重定向到后面的任何内容。这实际上会删除现有文件并将其替换为新文件。
虽然这种方法可行,但并不是最好的。如果您想就地替换文件中的字符串,sed 也可以通过添加“-i”选项来为您做到这一点:
sed -i 's/\<END\S*\s//gi' file.txt
这里有一个有用的参考资料,可以帮助您有效地措辞问题。您表达的需求越精确,得到的答案就会越好!
希望这可以帮助!
答案2
在这种情况下,由于输入格式很好,可能更容易使用cut
cut -d" " -f-8,10- file.txt
解释
-d" "
将字段分隔符设置为空格。默认为制表符。
-f-8,10-
取第一到第八个字段,然后取第十到最后一个字段。跳过第九个字段,即以“end”开头的字段。
答案3
sed -E 's/ (end|END)[^ ]+//g' file.txt
匹配并删除一个空格,后跟 end 或 END,后跟尽可能多的非空格。