这以前是在下面的url中提出的,但只使用正斜杠作为分隔符。https://stackoverflow.com/a/11245501/2520289
什么是正确的语法来做完全相同的事情,但使用任何其他兼容的sed分隔符?
我更改了分隔符以实现大多数bash环境的通用兼容性。(git-bash/任何linux)
例如,我目前正在执行以下片段来替换特定字符串的任何匹配项,但不是整行。
function misc_findReplace()
{
VARIABLE_FIND="$1"
VARIABLE_REPLACE="$2"
VARIABLE_FILE="$3"
echo "Finding: $VARIABLE_FIND"
echo "Replacing With: $VARIABLE_REPLACE"
echo "File to Operate On: $VARIABLE_FILE"
sed -i "s@${VARIABLE_FIND}@c${VARIABLE_REPLACE}@g" "$VARIABLE_FILE"
}
FILE_TO_WORK_WITH="/path/to/my/file.properties"
STRING_TO_FIND="destination_hostname=<destination_hostname>"
STRING_TO_REPLACE="destination_hostname=localhost"
misc_findReplace "$STRING_TO_FIND" "$STRING_TO_REPLACE" "$FILE_TO_WORK_WITH"
要在sed中使用不同的分隔符,您希望用反斜杠转义第一个出现的分隔符。这样,正确的命令将是sed-i"\@${VARIABLE_FIND}@c${VARIABLE_REPLACE}""$VARIABLE_FILE"
如果我正确理解了你的问题,你在变量VARIABLE_FIND
中有一些可能包含斜杠的文本,你想用$VARIABLE_REPLACE
替换所有包含该文本的行。
这个sed
命令将执行以下操作:
sed -i "/${VARIABLE_FIND//\//\\/}/c\\${VARIABLE_REPLACE}" "$VARIABLE_FILE"
它使用与链接到的答案中相同的命令,但首先通过将每个/
字符替换为\/
来转义$VARIABLE_FIND
。
完成的方法是使用bash
的构造${var//search/替换}
,以及一些用于在双引号内转义的额外反斜杠。
演示:
$ VARIABLE_FIND=/foo/
$ VARIABLE_REPLACE=This line has been replaced
$ echo -e 'some/foo/line\nsome/bar/line' | sed "/${VARIABLE_FIND//\//\\/}/c\\${VARIABLE_REPLACE}"
This line has been replaced
some/bar/line