0

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

アドレスを使用するなど、さまざまなアプローチを試みましたが、失敗し続けています。誰もこれを行う方法を知っていますか?

4

6 に答える 6

1

どうでしょう...

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

ただし、左に複数のドットまたはダッシュがある場合、これは機能しません。私はそれについてさらに考えなければならないでしょう。

于 2013-02-05T14:57:09.630 に答える
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 に答える
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

This might work for you (GNU sed):

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

"You wait ages for a bus..."

于 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 に答える