我已经阅读了很多帖子来了解如何使用 sed 正确转义字符串内的空格和特殊字符,但我仍然无法做到,这就是我想要实现的目标。
我有一个包含一些字符串的文件,如下所示:
JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.jsessionid=some_value"
我正在尝试使用以下内容替换“some_value”:
sed -i "s/^\(JAVA_OPTS=\"\$JAVA_OPTS[ \t]*-Dorg\.apache\.catalina\.jsessionid*=\s*\).*\$/\1$DORG_APACHE_CATALINA_JSESSIONID/" $JBOSS_CONFIGURATION/jboss.configuration
- $JBOSS_CONFIGURATION 是一个包含绝对 Linux 路径的变量。
- jboss.configuration 是我指向替换目标的文件 运营。
- $DORG_APACHE_CATALINA_JSESSIONID 包含我想要的值 “some_value”。
请注意模式:
JAVA_OPTS="$JAVA_OPTS -D
始终存在,org.apache.catalina.jsessionid 是我尝试用此脚本替换的变量值的示例。
缺少/错误什么?我也尝试使用\s 转义空格但没有成功, 并呼应整体给我以下内容:
echo "s/^\(JAVA_OPTS=\"\$JAVA_OPTS[ \t]*-Dorg\.apache\.catalina\.jsessionid*=\s*\).*\$/\1$DORG_APACHE_CATALINA_JSESSIONID/"
s/^\(JAVA_OPTS="$JAVA_OPTS[ \t]*-Dorg\.apache\.catalina\.jsessionid*=\s*\).*$/\1/
echo 是否像 sed 一样解释搜索模式?
非常欢迎任何信息/帮助/替代方法, 谢谢大家
最佳答案
echo 'JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.jsessionid=some_value"' | (export DORG_APACHE_CATALINA_JSESSIONID=FOO/BAR/FOOBAR; sed "s/^\(JAVA_OPTS=\"\$JAVA_OPTS[ \t]*-Dorg\.apache\.catalina\.jsessionid*=\s*\).*\$/\1${DORG_APACHE_CATALINA_JSESSIONID////\/}\"/")
注意 bash 扩展(为了转义任何可能导致 sed
出错的 /
)以及 之后的额外
以便正确关闭双引号。除此之外,您的 sed 表达式对我有用,上面的命令输出以下结果:\"
$DORG_APACHE_CATALINA_JSESSIONID
JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.jsessionid=FOO/BAR/FOOBAR"
关于linux - 使用linux sed用特殊字符替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17144388/