sedを使用してコロンが最初に現れるまで削除します


16

私のsedコマンドは、

 sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'

戻らなければならない、

bcde:cdeaf

(つまり)行の最初のコロンの前のすべての文字とコロン自体を削除する必要があります。

しかし、これは何も削除しません。

私の混乱は主に、

1)パターンマッチングの括弧は、sed regex-es内でエスケープする必要がありますか?

2)どちらの場合でも(エスケープ/エスケープなし)、動作していません。私は試した、

sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
sed 

1
あなたが欲しいsed 's/[^:]*://'。そして、あなたはd入力行をs///削除していません。ところで、あなたは置換コマンドでそれを修正しています。最初のコロンではないビットとそれに続くコロンをまったく置き換えないでください。
mikeserv

それはそれを解決します...ありがとう、男...これはsed内で正規表現パターンマッチングを学ぶために取った例です...だから、私は括弧でグループ/パターンマッチを使用する答えを探しています...

3
または、単にbashを使用しprintf "%s\n" "${line#*:}"ます:...
...-jasonwryan

1
@jasonwryan-サンプルソースを考慮した良い点。それは間違いなくそれを処理するためのより効率的な方法です。ただし、while read lineを取得する場合は$line、おそらくsed優先されるはずです。
mikeserv

回答:


23
$ echo 'abcd:bcde:cdeaf' | sed 's/^[^:]*://g'
bcde:cdeaf

最初^は行の始まりを意味します。これ[^:]、コロンではなく書く方法を知っている唯一の方法です。*コロンの後は、直前の任意の数の項目(この場合は非コロン)を意味します。最後に、:コロンを選択します。

つまり、行の先頭、コロン以外の任意の数、および最初のコロンを選択します。

//g手段は、一致したすべてのインスタンスを削除します。


3
ローブフラグ^も追加する場合を除いて、対戦を固定する必要はありませんg。パターンの最初の出現は1つだけであるため、globalフラグは[^:]*:^アンカーを付けなかった場合のように、行からすべてのパターンを削除しません。互いに不均衡になるだけの2つの不要なフラグで正規表現を複雑にするのではなく、そのままにしておくことができます。これは、この回答の編集バージョンがロールバックする前に示したものです。なぜあなたは私が知らない悪い情報を広めることを主張するでしょうが、それはこれを悪い答えにします。
mikeserv

@mikeserv、すでに述べたように、これを指摘してくれてありがとう。sedスキルの向上にご協力いただきありがとうございます。私はsedこれまでに取り上げた非常に限られた構文に慣れていないので、まだ慣れていません。それはsed(へー)、それが最適な(つまりあなたの)答えではないのに、私の答えはOPの問題を解決すると思います。これはWikipediaではなくStack Exchangeです。間違っている場合は修正してください。より良い回答を知っている場合は投稿して、人々がさまざまなアプローチを確認して比較できるようにしてください。編集機能で私の答えをあなたの答えに変えないでください。
user1717828

4
それは私の答えではありませんでした。それはあなたの答えであり、編集されました。それで全部です。そしてそれは良かった。もうありません。
mikeserv

4

列を操作するには、cut次のとおりです。

echo 'abcd:bcde:cdeaf' | cut -d: -f2-

同じか

echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement

その他のバージョンsed(ビッグデータの場合はより高速):

echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'

むしろエキゾチックな bash

echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }

または

echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }

または

echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}

あなたもあるsedのでそれを行うための適切な方法、追加することができますsed 's/[^:]*://'
don_crissti

@don_crisstiバージョンは上記の回答に記載されています。さらに、正規表現を使用するため、各行で式をコンパイルする必要があるため、処理が遅くなります。
コスタス

いいえ、ちがいます。上記の答えは大きな時間を費やし、多くのダウン票に値します-特にリビジョンとそこのコメントを読む場合。
don_crissti
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.