Sedは行からすべての開始パターン一致を削除します


11

次の行があります。

abababtestab

変換された行が次のようになるように、行の先頭からのsedすべての出現を削除する式を理解しようとしていabます:

testab

これは簡単なはずですが、本当に何も知りませんsed

これまでのところ:

sed 's/^ab//'

しかし、これはabの最初の出現を削除するだけです。

回答:


16
sed 's/^\(ab\)*//' <in >out

グループ化する必要があります。

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

一部の古いsedSはいえ、非常によくそれを処理しない場合があります。部分式の複製はBREのPOSIX仕様の機能ですが、一部sedのはそれを適切にサポートしていません。それらのいくつかでは、しかし...

echo abababtestab |
sed 's/^\(ab\)\1*//'

...代わりに働くかもしれません。


まさに私が探していたものに感謝します!(回答がありましたら、回答としてマークします)
Dan

sed1979年頃の第7版でもサポートされていました。グループ化を処理しないためには、それは劣った模造でなければなりません。
Jonathan Leffler、2015

@JonathanLeffler-POSIX 正規表現の根拠を参照してください。これは、部分的には、私がこのステートメントに基づいたものです。多分それは仮定ですが、そこにパラグラフがあります... 標準の開発者\n*は、をサポートするがをサポートしない一般的な履歴動作を考慮しました\n\{min,max\}\(...\)*、または\(...\)\{min,max\}、特定の実装の意図的でない結果として、それらは部分式と後方参照に続く複製と間隔式の両方をサポートしました。
mikeserv 2015

@JonathanLeffler:家宝のツールチェストのsedバージョンでも機能しません。
cuonglm

@cuonglm- \(ab\)\1*バージョンはデフォルトの家宝sedで動作し、\(ab\)*バージョンはSuSv4家宝で動作しsedます。少なくとも、それは私のビルドでは有効です。確かに、musl lib Cに対して家宝セットを作成したので、動作が異なる可能性があります。しかし、通常、指定された機能が家宝のSuSv4家宝ツールで機能するがデフォルトのツールでは機能しない場合、それは開発者が機能させたためです。
mikeserv 2015

6

別のsed

sed -e ':1' -e 's/^ab//;t1'

入力の各ラインにより、我々は、ラベルを設定し:1、次にやって、substitutionをab行の先頭に。substitutionが成功した場合、testコマンドはlabel 1に分岐しab、行の先頭にパターンが表示されなくなるまで作業をやり直します。これで完了です。


私の考えは正確です。厳密に言えば、テストする必要はありません。s/^ab//; t1十分
です

@glennjackman:もちろんです。更新しました!
cuonglm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.