如何将这些sed命令压缩成一个?

时间:2012-09-10 14:23:58

标签: sed

我在XML文件中做了一些替换(我知道这很糟糕,但它只是用于快速测试一些东西 - 通常我会使用解析器),使用sed。我有4个看起来完全相同的陈述,即匹配部分仅在密钥

中有所不同
  sed -i "s/\(key=\"liferay.db.host\" value=\)\".*\"/\1\"$hostname\"/" "$installer_directory/silent.xml"
  sed -i "s/\(key=\"idm.backend.db.host\" value=\)\".*\"/\1\"$hostname\"/" "$installer_directory/silent.xml"
  sed -i "s/\(key=\"idm-frontend.portal-tarent.tarent-frontend-host\" value=\)\".*\"/\1\"$hostname\"/" "$installer_directory/silent.xml"
  sed -i "s/\(key=\"openid-idp.hostname\" value=\)\".*\"/\1\"$hostname\"/" "$installer_directory/silent.xml"

现在我想知道是否有办法将这些内容放入一个sed语句中?

这样的东西
/\(key="(first_key|second_key|third_key)"\) value=\)\".*\"/

1 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

sed -i 's/\(key="\(liferay\.db\.host\|idm\.backend\.db\.host\|idm-frontend\.portal-tarent\.tarent-frontend-host\|openid-idp\.hostname\)" value=\)".*"/\1"'"$hostname"'"/' "$installer_directory/silent.xml"

使用交替将四个命令缩短为一个并替换可能被解释为元字符的句点,以匹配实际句点。