使用linux sed用特殊字符替换字符串

使用linux sed用特殊字符替换字符串,linux,bash,replace,sed,special-characters,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*\).*

我读过很多帖子,了解如何使用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
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/
  • $JBOSS_配置是一个包含绝对Linux路径的变量
  • jboss.configuration是一个我指向replace的目标文件 行动
  • $DORG_APACHE_CATALINA_JSESSIONID包含我想要的值 具有“某种价值”
请注意,模式:

JAVA_OPTS="$JAVA_OPTS -D
始终存在,org.apache.catalina.jsessionid是我试图用此脚本替换的变量值的一个示例

怎么了?我还尝试使用\s转义空白,但没有成功, 与整体相呼应,我得到以下信息:

sed -i "s/^\(JAVA_OPTS=\"\$JAVA_OPTS[ \t]*-Dorg\.apache\.catalina\.jsessionid*=\s*\).*\$/\1$DORG_APACHE_CATALINA_JSESSIONID/" $JBOSS_CONFIGURATION/jboss.configuration
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一样解释搜索模式

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

您可以这样使用sed:

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

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

以下内容适用于您:

sed -i 's#^\(JAVA_OPTS.*Dorg.apache.catalina.jsessionid\)=\([^"]*\)"#\1='"$DORG_APACHE_CATALINA_JSESSIONID"'"#' $JBOSS_CONFIGURATION/jboss.configuration
注意bash扩展(为了避开任何可能出现的
sed
)和
$DORG\u APACHE\u CATALINA\u JSESSIONID
之后的额外
\“
,以便正确关闭双引号。除此之外,sed表达式对我有效,并且上面的命令输出以下结果:

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

如果这个答案帮助你解决你的问题,请考虑把它标记为“接受”。“,因此将来遇到类似问题的用户将能够很容易地看到它。所有的回答都很有用,但这一个与我提供的示例最为一致,非常感谢。只是一个简单的补充,如何修改脚本来替换第一个或第二个出现的模式?我不知道你的意思。如果在sed中的最后一个
/
之后使用“g”修饰符,它将替换所有出现的内容。如果使用数字而不是“g”,则它将替换与该数字对应的引用。e、 g:sed's/foo/bar/g'将所有出现的'foo'替换为'bar'。sed's/foo/bar/2'将仅替换第二次出现。因为一般信息是正确的。非常感谢。我需要澄清一下:DORG\u APACHE\u CATALINA\u JSESSIONID//\/我是否需要添加与我必须在变量值中转义的字符一样多的字符?这里有4个连续的斜杠有什么意义?我将您重定向到bash的人:
man bash
。请特别查找名为
参数扩展
${Parameter/pattern/string}
的部分。一切都在那里解释。在本例中,两个外斜杠是
${parameter/pattern/string}
结构的一部分,两个内斜杠是
模式
本身,
\/
对应于
字符串
。非常感谢,手册中的章节很清楚,您的示例也很好。