Dmi*_*ank 5 bash pipe command-substitution
我正在尝试编写短脚本,以及以下命令:
echo "aaa111 bbb111" | xargs -I {} echo {} | sed 's/111/222/g'
Run Code Online (Sandbox Code Playgroud)
回归aaa222 bbb222,这是我所期待的.
我期待下一个命令:
echo "aaa111 bbb111" | xargs -I {} echo $(echo {} | sed 's/111/222/g')
Run Code Online (Sandbox Code Playgroud)
返回相同,但它返回aaa111 bbb111!这是为什么?
UPD:我想要实现的目标:
我有很多文件,比如pic30-coff-gcc,pic30-coff-ag等等,我需要为每个文件创建一个符号链接,比如pic30-gcc- > pic30-coff-gcc等.
所以我写了这个:
ls|grep 'coff-'|xargs -I {} ln -s {} $(echo {} | sed 's/coff-//g')
Run Code Online (Sandbox Code Playgroud)
它不起作用:对于每个文件,它报告该文件存在.我检查了这样的命令:
ls|grep 'coff-'|xargs -I {} echo "ln -s {} $(echo {} | sed 's/coff-//g')"
Run Code Online (Sandbox Code Playgroud)
是的,这sed部分不起作用:
ln -s pic30-coff-gcc pic30-coff-gcc
ln -s pic30-coff-gcc-4.0.3 pic30-coff-gcc-4.0.3
...
Run Code Online (Sandbox Code Playgroud)
但如果我只是打字
echo "ln -s pic30-coff-gcc $(echo pic30-coff-gcc | sed 's/coff-//g')"
Run Code Online (Sandbox Code Playgroud)
有用:
ln -s pic30-coff-gcc pic30-gcc
Run Code Online (Sandbox Code Playgroud)
然后我写了测试命令aaa111,它也不起作用.还是无法理解,为什么.
Jer*_*ska 19
该for环路的答案正是我不是来这里阅读.整个目的xargs是避免这种循环.xargs可能不是这个特例的最聪明的工具,但问题是关于它.
这是我最终得到的解决方案.它可能并不完美,但仍然有效:
echo "aaa111 bbb111" | xargs -I {} sh -c "echo \$(echo {} | sed 's/111/222/g')"
# Outputs aaa222 bbb222
Run Code Online (Sandbox Code Playgroud)
您可以提出相同命令的不同变体:
echo "aaa111 bbb111" | xargs -I {} sh -c 'echo $(echo {} | sed "s/111/222/g")'
echo "aaa111 bbb111" | xargs -I {} sh -c "echo \`echo {} | sed 's/111/222/g'\`"
Run Code Online (Sandbox Code Playgroud)
这里的要点仅仅是调用一个新的shell,它将用适当的内容xargs替换replace-str(here {})后执行命令替换.
$(echo {} | sed's/111/222/g')在作为参数传递给xargs之前进行评估.它将返回"{}"
因此:
echo "aaa111 bbb111" | xargs -I {} echo $(echo {} | sed 's/111/222/g')
Run Code Online (Sandbox Code Playgroud)
是相同的
echo "aaa111 bbb111" | xargs -I {} echo {}
Run Code Online (Sandbox Code Playgroud)
dev*_*ull -1
看来您所需要的只是一个简单的循环:
for file in *coff*; do
ln -s "${file}" "${file/coff-/}"
done
Run Code Online (Sandbox Code Playgroud)