sedでオプションのサフィックスを置き換える方法

sedでオプションのサフィックスを置き換える方法

テストには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})

おすすめ記事