0

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

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

我想用 's 替换.'s 和-' _s 但仅限于='s 标记。输出将是

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

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

4

6 回答 6

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
于 2013-02-05T14:55:45.240 回答
1

关于什么...

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

但是,这不适用于左侧有超过 1 个点或破折号的情况。我将不得不进一步考虑。

于 2013-02-05T14:57:09.630 回答
0

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

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

就是这样:

  • h:在保持空间中保存该行的副本
  • s:丢弃模式空间中等号之前的所有内容
  • x:交换模式并保持
  • s:吹走=模式中的所有内容
  • s:用下划线替换点和连字符
  • G:加入模式并用换行符保持
  • s:用等号替换换行符,将它们全部粘在一起
于 2013-02-05T18:54:46.440 回答
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
于 2013-02-06T07:52:28.270 回答
0

这可能对您有用(GNU sed):

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

“你等了好久才等公共汽车……”

于 2013-02-05T15:24:48.753 回答
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
于 2013-02-05T14:56:33.087 回答