Ven*_*pam 5 bash pipe sed command-substitution
在某些情况下,'find'、'bash' 和 'sed' 看起来不像人们预期的那样工作。
下面的例子应该首先创建文件'sample.txt',然后找到该文件,最后通过'-exec'命令处理它。执行的命令打印找到的文件名、测试样本和修改后的文件名。'sed' 命令本身用于将 'txt' 替换为 'TXT'。
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") \;
Run Code Online (Sandbox Code Playgroud)
预期的输出是:
./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT
相反,它产生:
./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT
(该示例还通过反引号 '`' 使用老式命令替换进行了测试,结果相同)
我究竟做错了什么?
命令替换甚至在开始之前执行find
。实际执行的命令(在替换、扩展和删除引号等之后)是
find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;
Run Code Online (Sandbox Code Playgroud)
如果您需要使用 运行任何奇特的东西(管道或多个命令)-exec
,请启动一个单独的 shell 来执行此操作:
find . -maxdepth 1 -type f -name '*.txt' \
-exec sh -c 'printf "%s " "$1"; printf "%s %s %s\n" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
264 次 |
最近记录: |