我一直在调查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并从文件中删除该文本块。
答案 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