使用sed在匹配的子串中查找和替换

时间:2013-02-05 14:45:44

标签: regex sed

我想使用sed来处理属性文件,例如:

java.home=/usr/bin/java
groovy-home=/usr/lib/groovy
workspace.home=/build/me/my-workspace

我想将.-替换为_,但只能取代=的令牌。输出将是

java_home=/usr/bin/java
groovy_home=/usr/lib/groovy
workspace_home=/build/me/my-workspace

我尝试了各种方法,包括使用地址,但我一直都在失败。有人知道怎么做吗?

6 个答案:

答案 0 :(得分:1)

在这种情况下,

awk 让生活更轻松:

awk -F= -vOFS="=" '{gsub(/[.-]/,"_",$1)}1' file

你去:

kent$  echo "java.home=/usr/bin/java
groovy-home=/usr/lib/groovy
workspace.home=/build/me/my-workspace"|awk -F= -vOFS="=" '{gsub(/[.-]/,"_",$1)}1'
java_home=/usr/bin/java
groovy_home=/usr/lib/groovy
workspace_home=/build/me/my-workspace

如果你真的想用sed( gnu sed

sed -r 's/([^=]*)(.*)/echo -n \1 \|sed -r "s:[-.]:_:g"; echo -n \2/ge' file

同样的例子:

kent$  echo "java.home=/usr/bin/java
groovy-home=/usr/lib/groovy
workspace.home=/build/me/my-workspace"|sed -r 's/([^=]*)(.*)/echo -n \1 \|sed -r "s:[-.]:_:g"; echo -n \2/ge'
java_home=/usr/bin/java
groovy_home=/usr/lib/groovy
workspace_home=/build/me/my-workspace

答案 1 :(得分:1)

怎么样......

$ echo foo.bar=/bla/bla-bla | sed -e 's/\([^-.]*\)[-.]\([^-.]*=.*\)/\1_\2/'
foo_bar=/bla/bla-bla

但是,如果您在左侧有一个以上的点或短划线,则不适用。我将不得不进一步思考。

答案 2 :(得分:0)

在这种情况下,我会使用AWK代替sed

awk -F"=" '{gsub("\\.|-","_",$1); print $1"="$2;}' <file.properties>

输出:

java_home/usr/bin/java
groovy_home/usr/lib/groovy
workspace_home/build/me/my-workspace

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/=/\n&/;h;y/-./__/;G;s/\n.*\n//' file

"You wait ages for a bus..."

答案 4 :(得分:0)

这适用于行中的任意数量的点和连字符,并且需要GNU sed:

sed 'h; s/.*=//; x; s/=.*//; s/[.-]/_/g; G; s/\n/=/'  < data

以下是:

  • h:在保留空间中保存该行的副本
  • s:扔掉图案空间中等号之前的所有内容
  • x:交换模式并按住
  • s:在模式中的=之后吹走所有内容
  • s:用下划线替换点和连字符
  • G:加入模式并使用换行符
  • s:用等于将其全部重新粘合在一起替换该换行符

答案 5 :(得分:0)

使用sed的其他方式

sed -re 's/(.*)([.-])(.*)=(.*)/\1_\3=\4/g' temp.txt

输出

java_home=/usr/bin/java
groovy_home=/usr/lib/groovy
workspace_home=/build/me/my-workspace

如果左侧有.-以上,那么

sed -re ':a; s/^([^.-]+)([\.-])(.*)=/\1_\3=/1;t a' temp.txt