我需要查找并替换目录中所有文件的某些字符串,包括子目录。我想我几乎使用以下方法来说明我的一般方法。我在-exec中做了更多,而不仅仅是替换,但为了清楚起见已经删除了它。
#!/bin/bash
#call with params: in_directory out_directory
in_directory=$1
out_directory=$2
export in_directory
export out_directory
#Duplicate the in_directory folder structure in out_directory
cd "$in_directory" &&
find . -type d -exec mkdir -p -- "$out_directory"/{} \;
find $in_directory -type f -name '*' -exec sh -c '
for file do
#Quite a lot of other stuff, including some fiddling with $file to
#get rel_file, the part of the path to a file from
#in_directory. E.g if in_directory is ./ then file ./ABC/123.txt
#will have rel_file ABC/123.txt
cat $file|tr -d '|' |sed -e 's/,/|/g' > $out_directory/$rel_file
done
' sh {} +
我可能会尝试将文件写入管道输出的一个问题。但是,这不是主要/唯一的问题,因为当我用显式测试路径替换它时,我仍然得到错误 | sed -e's /,/ | / g'|没有这样的文件或目录 这让我觉得cat $ file部分是问题?
任何帮助都会像往常一样受到大力赞赏 - 这只是我曾经写过的第二个BASH脚本所以我希望我犯了一个相当基本的错误!
答案 0 :(得分:3)
你的"内心"单引号被视为"外部"单引号并导致您出现问题。您认为在|
命令中引用了tr
,但您实际在做的是结束带有不带引号|
的初始单引号字符串然后开始一个新的单引号字符串。然后,第二个单引号字符串以您认为正在启动sed
脚本的单引号结束,而是结束前一个单引号字符串等。
如果可以的话,对那些嵌入的单引号使用双引号。如果你不能这样做,你必须使用'\''
序列来获得单引号字符串中的文字单引号。