【发布时间】:2021-06-03 18:33:11
【问题描述】:
我有一个要在文件中替换的字符串列表。但是,当我运行sed -i(直接更改文件)时,只有最后一个替换有效。我认为最后一个会覆盖之前的所有更改?
#!/bin/bash
# echo "searching text to be replaced from csv file.."
mapfile -t searchArray < search
mapfile -t replacementArray < replacement
for file in *.txt;
do
echo ">>>processing $file.."
for idx in "${!searchArray[@]}"; do
echo "@@replacing ${searchArray[idx]}"
if [[ ${searchArray[idx]} != "" && ${replacementArray[idx]} != "" ]]; then
ESCAPED_REPLACE=$(printf '%s\n' "${searchArray[idx]}" | sed -e 's/[\/&]/\\&/g')
sed -i "s/$ESCAPED_REPLACE/${replacementArray[idx]}/g" "$file"
fi
done
done
尝试像这样处理 sed 文件:
for idx in "${!searchArray[@]}"; do
if [[ ${searchArray[idx]} != "" && ${replacementArray[idx]} != "" ]];
then
ESCAPED_REPLACE=$(printf '%s\n' "${searchArray[idx]}" | sed -e
's/[\/&]/\\&/g')
printf 's/%s/%s/g\n' "$ESCAPED_REPLACE" "${replacementArray[idx]}"
fi
done >script.sed
for file in *.txt;
do
sed -f script.sed "$file" >outputfile && mv outputfile "$file"
done
但是搜索字符串有一些特殊字符,例如"${template(properties).activateDate}(pd -> \"#dateFormatCalc('$pd', 'long', 'dd MMM yyyy','-12Q')\")",我怎样才能在*.sed 文件中转义这些特殊字符?我的意思是以编程方式生成 *.sed 文件。
编辑: 这是我的搜索文件(两行):search string
${template(properties).activateDate}(pd -> \"#dateFormatCalc('$pd', 'long', 'dd MMM yyyy','-12Q')\")
${template(properties).activateDate}(pd -> \"#dateFormatCalc('$pd', 'long', 'dd MMM yyyy','-16')\")
这是我的替换文件(两行):
#dateCalc('dd-mm-yyyy','end','-12','Q')
#dateCalc('dd-mm-yyyy','end','-16','Q')
这是我的测试文件(搜索和替换)。它是一个 JSON 文件: code sample pic
{
"type": "TEXTBOX",
"type": "TEXTBOX",
"label": "${template(properties).activateDate}(pd -> \"#dateFormatCalc('$pd', 'long', 'dd MMM yyyy','-12Q')\")",
"value": "${template(properties).activateDate}(pd -> \"#dateFormatCalc('$pd', 'long', 'dd MMM yyyy','-12Q')\")",
"format": "PERCENTAGE",
"displayTotal": false,
"deactivated": false
}
预期的结果应该是这样的:
{
"type": "TEXTBOX",
"type": "TEXTBOX",
"label": "#dateCalc('dd-mm-yyyy','end','-12','Q')",
"value": "#dateCalc('dd-mm-yyyy','end','-12','Q')",
"format": "PERCENTAGE",
"displayTotal": false,
"deactivated": false
}
【问题讨论】:
-
@tripleee 谢谢。是的,我正在处理 sed 文件,但 searchArray 中的搜索字符串有一些特殊字符。如何通过代码生成它?搜索字符串类似于“ ${template(properties).activateDate}(pd -> \"#dateFormatCalc('$pd', 'long', 'dd MMM yyyy','-12Q')\") ”
-
您描述的症状似乎很难理解;您的代码本身看起来确实应该执行所有替换。您的输入文件中是否有 DOS 换行符?或者问题可能只是因为您忘记转义需要转义的内容(例如,未转义的
$与文字$不匹配)。 -
请不要编辑您的问题,以免现有答案不再有意义。您最初的尝试尝试循环运行
sed -i,但现在我的回答看起来很奇怪,因为您取出了我正在评论的代码。 -
我从未见过
paste -d /没有正确加入列的地方。您是否在某个 Busybox 或基于 DOS 的平台上?或者您的输入文件是否包含不可见的控制字符(可能是 DOS 换行符)? -
如果你的
paste真的坏了,你可以用paste <(sed ...) <(sed ...)解决这个问题,并让随后的sed脚本也将分隔制表符更改为斜线。