使用sed的bash substring args;嵌套报价问题?

时间:2013-10-28 20:16:02

标签: bash sed nested

我有一个命令gennlm.sh,它需要两个参数 - 输入文件和输出文件夹。我想获取目录中的每个文件,使用这些文件进行输入,然后转换每个输入文件名以提供输出文件夹,并将其全部设置为cronjob。这就是我到目前为止所做的:

10 */6 * * * for file in /var/www/parsingdev/corpus/*; do bash /var/www/parsingdev/meTypeset/tools/gennlm.sh $file '$file | sed -e "s/.*\//\/var\/www\/parsingdev\/output\//g" -e "s/\.docx//g"'; done

但是,我试图让第二个参数工作,并且所有的子串函数都嵌套在''中似乎有一些问题,因为预期的字符串参数没有按预期传递给gennlm.sh脚本。介意澄清我需要做些什么来使这项工作?谢谢!

2 个答案:

答案 0 :(得分:0)

您不能在单引号中使用变量。

相反,做

10 */6 * * * for file in /var/www/parsingdev/corpus/*; do fileX=${file%.docx}; bash /var/www/parsingdev/meTypeset/tools/gennlm.sh ${fileX##*/}; done

我希望我理解你原来命令中的无意义:

'$file | sed -e "s/.*\//\/var\/www\/parsingdev\/output\//g" -e "s/\.docx//g"

“双引号”每个扩展,以及任何可能包含特殊字符的内容,例如: “$ var”,“$ @”,“$ {array [@]}”,“$(command)”。使用“单引号”来制作文字,例如。 '花费5美元'。请参阅http://mywiki.wooledge.org/Quoteshttp://mywiki.wooledge.org/Argumentshttp://wiki.bash-hackers.org/syntax/words

答案 1 :(得分:0)

如果我理解正确,你的sed应该取文件的基名并删除它的.docx扩展名(如果有的话),并在它前面添加一个路径。那么,既然你已经发布了bash,为什么不用bash做所有事情呢?

for file in /var/www/parsingdev/corpus/*; do bash -c 'out=${1##*/}; /var/www/parsingdev/meTypeset/tools/gennlm.sh "$1" "/var/www/parsingdev/output/${out%.docx}"' _ "$file"; done

或者真的是bash中的所有内容:

bash -c 'for file in /var/www/parsingdev/corpus/*; do out=${file##*/}; /var/www/parsingdev/meTypeset/tools/gennlm.sh "$file" "/var/www/parsingdev/output/${out%.docx}"; done'