我已经阅读了很多帖子,了解如何使用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
请注意图案:
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解释搜索模式吗?
非常欢迎任何信息/帮助/替代方式 谢谢大家
答案 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