sed或awk使用文本文件替换文本

时间:2016-02-23 02:00:55

标签: bash awk sed

我一直在调查alias runautohelper='runproject autohelper 8009; google-chrome 127.0.0.1:8009/bitbucket/create-repo' sed。我没有找到一个示例,显示使用文本文件(findtext.txt)扫描所有* .php文件并删除文本。

几乎我有一块文本需要为一堆php文件删除。

我知道如何使用像这样的基本sed命令

awk

我想做的是让sed看看findtext.txt抓住文本块,然后扫描* .php并从文件中删除该文本块。

2 个答案:

答案 0 :(得分:3)

有两个挑战:

  • 使用存储在变量或文件中的文本,当用作sed s///函数的正则参数时,应将字面视为 在该文本中必须逃避正则表达式元字符的挑战。

  • 此外,由于您正在讨论存储在文件findtext.txt中的文本,我假设您正在谈论一个行解决方案 - 而sed默认情况下单行定向。

以下解决方案解决了这两个挑战:

# Read the multiline search string into a variable 
# and quote it to ensure literal treatment when used as a regex.
sometextQuoted=$(sed -e 's/[^^]/[&]/g; s/\^/\\^/g; $!a\'$'\n''\\n' < 'findtext.txt' | 
  tr -d '\n')

# Now process the *.php files:
# Read each file *as a whole* before performing the string replacement.
sed ':a; $!{N;ba}; s/'"$sometextQuoted"'/replacetext/g' *.php
  • 解决方案基于我的this answer,详细解释了用于引用(转义)搜索文本(sed)的sometextQuoted=...命令。

  • ':a; $!{N;ba}是标准的sed成语,可以一次读取整个文件。

  • 请注意"$sometextQuoted"如何拼接到其他单引号sed脚本中,以避免混淆shell先解释的内容与{{1}最终看到了。

  • 请注意,如果您还想从变量/文件中读取替换文本(示例中为sed),则不同的表单引用(转义)将是必需的 - 再次,请参阅linked answer

注意:第二个replacetext命令需要 GNU sed,我假设您正在使用(sed没有参数,并且&n; #39;使用BSD / OSX -i); 是可能的,但更复杂,使其适用于BSD / OSX sed
此外,我从命令中省略了sed,因此您可以先检查结果而不替换原始文件。

答案 1 :(得分:1)

findtext.txt的内容分配给bash变量,并在sed替换中使用该变量。以下是一个单行解决方案。如果findtext.txt中有多行,我不确定它是否有效。

$ findtext=$(cat findtext.txt) && sed -i.bak -e "s/$findtext/bbbb/g" *.php