如何使用shell脚本附加到特定行?

时间:2017-08-15 09:44:38

标签: linux shell awk sed

我有一个文件(catalina.properties),其中包含以下特定行:       {{row.Name}

在另一个环境中,它看起来像这样:
      common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar"

我需要一个命令,在等号的右侧附加一个额外的部分,并且在两种情况下均有效,结果将是:

common.loader=

或在另一种情况下:

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.base}/extra/part.jar"  

2 个答案:

答案 0 :(得分:3)

sed 解决方案:

示例性测试输入文件testfile

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar"
common.loader=
"ddd""sdsd"
sed 's~common\.loader=.*~&,"${catalina.base}/extra/part.jar"~; s/=,/=/' testfile

输出:

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.base}/extra/part.jar"
common.loader="${catalina.base}/extra/part.jar"
"ddd""sdsd"

答案 1 :(得分:1)

您能否请尝试关注awk并告诉我们这是否对您有所帮助。 非单一衬里形式的解决方案:

awk -v base="\${catalina.base}/lib" -v ja="\${catalina.base}/lib/*.jar" -v s1="\"" -v extra_part="\${catalina.base}/extra/part.jar" -v s2="," '
/common.loader=$/{
  sub(/.*/,"&"s1 base s1 s2  s1 ja s1 s2 s1 extra_part s1);
  print;
  next
}
/common.loader=.*jar\"/{
  sub(/.*/,"&" s2 s1 extra_part s1);
  print;
  next
}
1
'   Input_file

一种形式的解决方案:

awk  -v base="\${catalina.base}/lib" -v ja="\${catalina.base}/lib/*.jar" -v s1="\"" -v extra_part="\${catalina.base}/extra/part.jar" -v s2="," '/common.loader=$/{sub(/.*/,"&"s1 base s1 s2 s1 ja s1 s2 s1 extra_part s1);print;next} /common.loader=.*jar\"/{sub(/.*/,"&" s2 s1 extra_part s1);print;next}1'  Input_file

此外,由于您需要编辑Input_file本身,因此您可以在上述代码的末尾添加以下代码,并且可以执行相同的操作

.... > tmp_file && mv tmp_file Input_file

EDIT1:如果您只想在其中一个条件中添加额外部分,那么您可以尝试关注。

awk -v s1="\"" -v extra_part="\${catalina.base}/extra/part.jar" '
/common.loader=/{
  s2=$0 ~ /=$/?"":",";
  sub(/.*/,"&" s2 s1 extra_part s1);
  print;
  next
}
1'   Input_file