用linux sed替换带有特殊字符的字符串

时间:2013-06-17 09:31:22

标签: linux bash replace sed special-characters

我已经阅读了很多帖子,了解如何使用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/

是sed解释搜索模式吗?

非常欢迎任何信息/帮助/替代方式 谢谢大家

4 个答案:

答案 0 :(得分:2)

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)以及\"之后的额外$DORG_APACHE_CATALINA_JSESSIONID以便正确关闭双引号。除了你的sed表达式对我有用,上面的命令输出以下结果:

JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.jsessionid=FOO/BAR/FOOBAR"

答案 1 :(得分:1)

您可以像这样使用sed:

sed -r '/\$JAVA_OPTS -D/{s/^(.+=).*$/\1'"$DORG_APACHE_CATALINA_JSESSIONID"'/;}' $JBOSS_CONFIGURATION/jboss.configuration

答案 2 :(得分:1)

您可以指定一个与所需字符串匹配的模式,而不是尝试完全指定它。

以下内容对您有用:

sed -i 's#^\(JAVA_OPTS.*Dorg.apache.catalina.jsessionid\)=\([^"]*\)"#\1='"$DORG_APACHE_CATALINA_JSESSIONID"'"#' $JBOSS_CONFIGURATION/jboss.configuration

答案 3 :(得分:1)

sed 's/=\w.*$/='"$DORG_APACHE_CATALINA_JSESSIONID"'/' $JBOSS_CONFIGURATION/jboss.configuration