【发布时间】:2021-04-25 15:49:12
【问题描述】:
DESTINATION="example_substitute.txt"
echo "$DESTINATION"
DESTINATIONPATH="/home/example/test"
echo "$DESTINATIONPATH"
ARRAY=('EXP1' 'EXP2' 'EXP3 EXP4' 'EXP5 EXP6')
for n in "${ARRAY[@]}"; do
(
echo "$n"
echo "sudo grep -RiIl --exclude-dir={_themes,_styleguide,_templates,_static,_RFCs,_glossary,_scripts,_blockdiag,_Definition} ' $n ' | xargs sed -i 's/ $n / :term:`$n` /g' ./*.rst" >> $DESTINATIONPATH/$DESTINATION
)
done
我想从数组中合并我的 grep 命令并将其放入 $DESTINATIONPATH/$DESTINATION
作为新手 echo "$n" 带来正确的表达式。 第二个回声与引号斗争:
应该是:
sudo grep -RiIl --exclude-dir={_themes,_styleguide,_templates,_static,_RFCs,_glossary,_scripts,_blockdiag,_Definition} ' EXP1 ' | xargs sed -i 's/ EXP1 / :term:`EXP1` /g' ./*.rst
sudo grep -RiIl --exclude-dir={_themes,_styleguide,_templates,_static,_RFCs,_glossary,_scripts,_blockdiag,_Definition} ' EXP2 ' | xargs sed -i 's/ EXP2 / :term:`EXP2` /g' ./*.rst
sudo grep -RiIl --exclude-dir={_themes,_styleguide,_templates,_static,_RFCs,_glossary,_scripts,_blockdiag,_Definition} ' EXP3 EXP4 ' | xargs sed -i 's/ EXP3 EXP4 / :term:`EXP3 EXP4` /g' ./*.rst
sudo grep -RiIl --exclude-dir={_themes,_styleguide,_templates,_static,_RFCs,_glossary,_scripts,_blockdiag,_Definition} ' EXP5 EXP6 ' | xargs sed -i 's/ EXP5 EXP6 / :term:`EXP5 EXP6` /g' ./*.rst
【问题讨论】:
-
“与引号作斗争”是什么意思?输出是有效的,有什么问题吗?究竟是什么? (除了,它缺少
EXP5 EXP6,我猜这是复制+粘贴的东西,对吧?)而xargs sed ... ./*.rst没有意义 - 你可以删除grep和xargs。 -
对不起我的英语不好:输出应该在之前:sudo grep -RiIl --exclude-dir={_themes,_styleguide,_templates,_static,_RFCs,_glossary,_scripts,_blockdiag,_Definition} 'EXP1' | xargs sed -i 's/ EXP1 / :term:
EXP1/g' ./*.rst 如果你看 'EXP1' | xargs sed -i 's/ EXP1 / :term:EXP1但它会中断,只有当我取出 ' 和 ` 我得到了错误的结果。对我来说重要的是得到这个:'EXP1'| xargs sed -i 's/ EXP1 / :term:EXP1 -
您需要避开反引号,否则它们会扩展为 command substitution(在您的情况下,这可能会引发错误,因为
$n的值不是命令) -
作为旁注,一般来说生成动态代码并不是你时间的最佳利用,你最好有一些可以参数化并调用的静态代码(函数或脚本文件)它与你的变量
-
与您的原始问题并没有真正的关系,但是为什么要在单独的子进程中运行循环体?