1

次の形式のテキスト ファイルがあります。

...
SomeText.any_text/ch SomeText2.any_3/ch 5.6e-5
SomeText.any_text/ch something.else.point.separated/ch4 5.4e5
...

行には、3 つの要素があります。

文字列でのみポイントをスラッシュに置き換える必要があります。

このような正規表現でsedを使用しようとしました

sed 's/\([\w_]\+\)\(\.\)/\1\//g'

そして、肯定的な結果を持っていません。

4

4 に答える 4

1

あなたの要素はフィールドのように見えます。したがって、私の好ましい方法は、次を使用することawkです。

awk '{ for (i=1; i<=2; i++) gsub(/\./, "/", $i) }1' file.txt

結果:

SomeText/any_text/ch SomeText2/any_3/ch 5.6e-5
SomeText/any_text/ch something/else/point/separated/ch4 5.4e5
于 2012-10-17T06:54:57.907 に答える
1

これはうまくいくかもしれません(GNU sed):

sed 's/[^ ]*$/\n&/;h;y/./\//;G;s/\n.*\n//' file

説明:

  • s/[^ ]*$/\n&/最後のフィールドの前に改行を挿入する
  • hパターン スペース (PS) をホールド スペース (HS) にコピーします。
  • y/./\//PS のすべて.の を に変換します/
  • G改行を追加してから HS を PS に追加します
  • s/\n.*\n//最初と最後の改行の間のすべてを削除します。つまり、古い文字列を削除します

このイディオムを使用すると、複雑な正規表現に頼る必要なく、行の一部を簡単に変更できます。

于 2012-10-17T07:32:06.810 に答える
0

これは、2つのループを使用して従来sedの表記法で行うことができます。1つは最初のフィールドのドットを修正し、もう1つは2番目のフィールドのドットを修正します。

sed -e ':f1' -e 's/^\([^ .]*\)\./\1\//'                  -e 't f1' \
    -e ':f2' -e 's/^\([^ ][^ ]*\) \([^ .]*\)\./\1 \2\//' -e 't f2'

アンカーは、^これが正しく機能するために重要です。sedはい、 ;への1つの引数ですべてを1行に書き込むことができます。スクリプトがこのように複雑な場合は、個別の引数を明確にすることをお勧めします。典型的なsedスクリプトは、理解に余分な障害を追加することなく、十分に不可解です。

sed ':f1;s/^\([^ .]*\)\./\1\//;t f1;:f2;s/^\([^ ][^ ]*\) \([^ .]*\)\./\1 \2\//;t f2'

入力サンプル(2行)の場合、出力は次のとおりです。

SomeText/any_text/ch SomeText2/any_3/ch 5.6e-5
SomeText/any_text/ch something/else/point/separated/ch4 5.4e5

GNUを使用している場合は、オプションsedを追加する必要があるかもしれませんが、--posixそれ自体は正しく動作しているように見えます(したがって、POSIX以外の表記を使用していないため、POSIXに固執していることが認識された可能性があります)。

sedBSDおよびGNUを使用してMacOSX10.7.5でテスト済みsed

于 2012-10-17T07:02:39.387 に答える
0
awk '{gsub(/\./,"",$1);;gsub(/\./,"",$2);print}' your_file
于 2012-10-17T07:08:32.890 に答える