提问者:小点点

使用具有不同分隔符的Sed替换整行


这以前是在下面的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"

共2个答案

匿名用户

要在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