3

私がこのデータを持っているとしましょう

1:a:b:c
2:d:e:f
3:a:b
4:a:b:c:d:e:f

そして私が欲しい出力は

1a1b1c
2d2e2f
3a3b
4a4b4c4d4e4f

私はこの質問からそれを得ました

私が試していた解決策はこれでした

sed -re 's/^([0-9]):/\1/g;s/:/L/g' temp.txt

私には2つの異なるパターンがあります。\12番目のパターンで使用できることを知りたいだけです

このような

sed -re 's/^([0-9]):/\1/g;s/:/\1/g' temp.txt

4

3 に答える 3

5

キャプチャグループは、それが作成された置換コマンドでのみ使用できます。これは、学習するための優れたリソースですsedhttp ://www.grymoire.com/Unix/Sed.html

あなたの問題に取り組むためのより良い方法は、使用することawkです:

awk -F: '{ OFS=$1; $1="" }1' file

結果:

1a1b1c
2d2e2f
3a3b
4a4b4c4d4e4f

説明:

-Fフラグは、フィールド区切り文字をコロン( )に設定します-F:。次に、入力の各行について、出力フィールドセパレータを最初のフィールド(OFS="$1")に設定し、最初のフィールドを「削除」します(または単にnullに設定します; $1="")。最後に、デフォルトの1印刷を有効にします。HTH。

于 2013-01-09T02:56:22.903 に答える
3

そのようにすることはできませんが、別の方法があります。

sed ':a;s/^\([0-9]*\):\([^:]*\):/\1:\2\1/;ta;s/://' input

説明

do {                                                           // a:
  1) match numbers at the beginning and a `:`                  // ^\([0-9]*\):
  2) match and remember everything that is not `:` upto an `:` // \([^:]*\):
  3) swap the `:` with the number from 1 (keep the first `:`)  // /\1:\2\1/
} while (there are matches)                                    // ta
finally delete the `:` after the number                        // s/://
于 2013-01-09T02:48:57.973 に答える
0

これはあなたのために働くかもしれません(GNU sed):

sed -r ':a;s/^(([^:]*):.*):|:/\1\2/;ta' file
于 2013-01-09T12:06:06.020 に答える