以下脚本有效,但declare $line
有什么用途?如果我删除它,它就不起作用。
{} \;
命令中{} +
和find
的区别是什么?
awk '{print "old="$1" new="$2}' list.txt |\
while IFS= read line; do
declare $line
find /path -name '*.ext' -exec sed -i "s/\b$old\b/$new/" {} +
done
答案 0 :(得分:6)
declare
正在设置变量:您的awk
命令会发出old=foo new=bar
形式的内容。运行declare old=foo new=bar
会设置这两个变量。
尽管如此,这是一种错误和草率的方式。相反,使用read
直接从输入文件中读取所需的字段并分配给变量(BashFAQ #1中的更多内容):
while read -u 3 -r old new _; do
find /path -name '*.ext' -exec sed -i "s/\b$old\b/$new/" {} +
done 3<list.txt
为了使这更安全一点,人们也可以逃避文字内容而不被视为正则表达式:
requote() { sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< "$1"; };
substquote() { sed 's/[&/\]/\\&/g' <<< "$1"; }
while read -u 3 -r old new _; do
find /path -name '*.ext' -exec \
sed -i "s/\b$(requote "$old")\b/$(substquote "$new")/" {} +
done 3<list.txt
请注意,我没有更改\b
的使用,这是sed
的许多实现不支持的扩展。有关进行文字字符串替换的替代方法,请参阅BashFAQ #21。
为了完整性(尽管这个不相关的主题确实应该被作为一个单独的问题提出 - 并且在这种情况下可能会被重复关闭,因为之前已经被问及并回答过),请允许引用{{{ 1}}手册页:
find
答案 1 :(得分:-1)
声明或排版Builtins是完全同义词,允许修改变量的属性。这是某种编程语言中可用类型的一种非常弱的形式。 declare命令特定于Bash的版本2或更高版本。 typeset命令也适用于Ksh脚本。