2

我已经阅读了很多帖子以了解如何使用 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 那样解释搜索模式?

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

4

4 回答 4

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"
于 2013-06-17T10:13:03.117 回答
1

您可以像这样使用 sed:

sed -r '/\$JAVA_OPTS -D/{s/^(.+=).*$/\1'"$DORG_APACHE_CATALINA_JSESSIONID"'/;}' $JBOSS_CONFIGURATION/jboss.configuration
于 2013-06-17T09:45:45.600 回答
1

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

以下内容应该适合您:

sed -i 's#^\(JAVA_OPTS.*Dorg.apache.catalina.jsessionid\)=\([^"]*\)"#\1='"$DORG_APACHE_CATALINA_JSESSIONID"'"#' $JBOSS_CONFIGURATION/jboss.configuration
于 2013-06-17T09:45:54.973 回答
1
sed 's/=\w.*$/='"$DORG_APACHE_CATALINA_JSESSIONID"'/' $JBOSS_CONFIGURATION/jboss.configuration
于 2013-06-17T10:24:30.397 回答