在 for in 循环中使用 sed 从文件中删除单词

在 for in 循环中使用 sed 从文件中删除单词

我有一个包含文本的文件“book”(不是txt)。我还有一个需要从所述文件中删除的单词列表。我已经编写了这个脚本,但由于某种原因,当我尝试检查文件在执行后是否已更改时,我没有得到任何更改。我尝试将结果输出到 book > output.txt 但“output”仍然具有与“book”相同的文本。

代码 :

for word in {am pm cm words count ......}
do
    sed -i 's/${word}//g' book
done

您知道为什么列表中的单词没有按应有的方式删除吗?

答案1

变量不在单引号内展开,而是在双引号内展开。你应该去

for word in am pm cm words count etc
do
  sed -i "s/${word}//g" book
done

请注意,您也可以sed只调用一次并达到相同的效果

sed -i "s/am\|pm\|cm\|words\|count//g" book

答案2

如果单词列表非常长,您可以使用数组bash并对其进行格式化。

words=(am pm cm words count etc)

fmt=$(IFS='|'; printf '%q' "s/${words[*]}//g")

echo sed -i "$fmt" book
  • 如果需要,只需在数组单词中添加更多元素即可。

  • 删除echo所以 sed 可以完成它的工作。

相关内容