【发布时间】:2020-07-07 22:21:42
【问题描述】:
我有一个目录,我们称它们为模板文件。 它们有一个需要替换的值。 我想要一个原始文件夹,每个文件的替换位置都有一个“关键字”。 我想替换这个词并将所有文件输出到一个新文件夹,其中的文件名称与输入相同。 我在这里找到的命令是:
find . -name '*.sql' -i -exec sed -e 's/TEXTTOSUBSTITUTE/SUBSTITUTIONTEXT/g' {} \;
如何让这个命令将文件输出到另一个目录并保持原件不变? 非常感谢你的帮助! 我希望原始文件保持不变。该文件夹称为 Templates,与 Templates 目录位于同一目录中的文件夹称为 Usefiles。模板文件充当基础文件,因此不应更改。我想我可以使用上面的建议,但是执行 2 个单独的 find 命令,一个用于复制,另一个用于 sed 在新目录中 更新>>>> 我一直在尝试这些建议,但 sed 似乎不起作用。副本有效,但 sed 是一个变量,在脚本中显示为空白。 这是我的电流,再次感谢!! :
#!/bin/bash
echo "Enter Year i.e. 2020"
read -p reportyear
echo "Enter Month i.e. 04"
read -p reportmonth
SUBSTITUTIONTEXT=$reportyear/$reportmonth
find MOT/ -name '*.sql' -exec sh -c 'for f; do
echo cp -v "$f" MOU/ && echo sed -ie "s/TEXTTOSUBSTITUTE/$SUBSTITUTIONTEXT/g" MOU/"${f##*/}"
done' _ {} +
最终更新 感谢你们,一个可行的解决方案:
echo "Enter Year i.e. 2020"
read reportyear
echo "Enter Month i.e. 04"
read reportmonth
SUBSTITUTIONTEXT=$reportyear\/$reportmonth
cd /to/relevant/files
find MOT/ -name '*.sql' -exec sh -c 'for f; do
cp -v "$f" MOU/ && sed -i 's@SUBSTITUTIONYEARMONTH@"$SUBSTITUTIONTEXT"@' MOU/"${f##*/}"
done' _ {} + > /dev/null 2>&1
【问题讨论】:
-
另一个目录是否与 .sql 文件位于同一文件夹中?而且这里真的需要
find吗,子目录下有没有.sql文件? -
我的回答目前原始文件被复制到目的地不变并编辑当前目录中的文件。我就是这么理解你的问题的。
-
或者我得到了相反的逻辑...... :-(
-
对 sed 使用不同的分隔符,例如
"s,TEXTTOSUBSTITUTE,$SUBSTITUTIONTEXT,g"基本上分隔符不能在字符串/正则表达式中,因此您可以选择任何字符串,例如管道|或我向您展示的逗号,。