
テストには2つの行(オプションのサフィックスがある場合とない場合)を使用しました(最後の2つの列挙要素、D2、E2)。
echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" | sed -E 's/^(.*),(.*),(.*)((,.*)(,.*)){0,1}$/[\1],\2,\3\5\6/'
[A1],B2,C2
[A2,B2,C2],D2,E2
どこでそれを受けたいですか?
[A1],B2,C2
[A2],B2,C2,D2,E2
最後の2つのコンポーネントをオプションとして作成し、見つかった場合に備えて最後に追加したいと思います。
繰り返し{x、y}と疑問符(?)を試してみましたが、sed検索パターンで最後の2つの要素を実際に選択できませんでした。パターンを '^'と '$'でラップし、オプションではなくパターンを最初に試みるのではなく、最初に非常に熱心なコンポーネントを含む選択パターンのみを使用するため、sedは非常に熱心なようです。
注:正規表現は実際に必要なものを単純化したものなので、他の方法でそれを克服することは役に立たないかもしれません。私はsedを使ってこれをしたいと思います。これは、ツールのヒントについての知識を向上させるためのものです。
編集:答えてくれてありがとう。これが私の目標でした。
sed -E 's/^([^,]*),([^,]*),([^,]*)(,[^,]*)?(,[^,]*)?$/[\1],\2,\3\4\5/'
答え1
あなたのsed設定の目的が何であるかはわかりませんが、あなたが何を間違っているのか教えてください。
正規表現で最初の3つの英数字の組み合わせを一致させようとします。 sedの正規表現は「欲張り」なので、文字、数字、およびカンマは単一の組み合わせと一致するため、最初の組み合わせはすでに3つの組み合わせと(.*),(.*),(.*)
一致するため、コンマと一致することをお勧めします。 -自由な文字(例:([^、] *))、魔女はコンマのない文字と一致します。コマンドは次のとおりです。(.*)
.
echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" | sed -E 's/^([^,]*),([^,]*),([^,]*)((,[^,]*)(,[^,]*)){0,1}$/[\1],\2,\3\5\6/'
常に3つまたは5つの入力の組み合わせである場合は、正規表現を次のように「短縮」することもできます。
echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" | sed -E 's/^([^,]*)(((,[^,]*){2}){1,2})$/[\1]\2/'
しかし、実際にはユースケースによって異なります。最初の英数字
の組み合わせと一致し、前にカンマがある次の2つまたは4つの組み合わせと一致します(例では、B2、C2または、B2、C2、D2、E2入力)。^([^,]*)
((,[^,]*){2})
答え2
OPが何を達成しようとしているのかはまだわかりませんが、貪欲ではない一致を実行するには、この場合は否定的な文字クラスを使用できます[^,]
。
echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" |
sed -E 's/([^,]+)((,[^,]+){2})((,[^,]+){0,2})/[\1]\2\4/'
[A1],B2,C2
[A2],B2,C2,D2,E2
echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" |
sed -E 's/([^,]+)((,[^,]+){2})((,[^,]+){0,2})/[\1]\2\5/'
[A1],B2,C2
[A2],B2,C2,E2
各ゲームを別々にキャプチャしながら走るそれは別のことです...
OPがより完全な例を提供しているなら...おそらく私たち全員が再び見ることができるでしょう!この運動は私たちにとって良いです;)
答え3
$ echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" | sed -e 's/[^,]*/[&]/' -e 's/[^,]*/(&)/2' -e 's/[^,]*/{&}/3'
[A1],(B2),{C2}
[A2],(B2),{C2},D2,E2
1回の交換ですべてを試すのではなく、最後に数字フラグを使用してどのゲーム(ここで2/2
番目と3番目のゲーム)を実行するかを選択できるという事実を利用できます。/3
明確にするために上記のコマンドは次のとおりですsed
。
sed -e 's/[^,]*/[&]/' \
-e 's/[^,]*/(&)/2' \
-e 's/[^,]*/{&}/3'