私のsedコマンドは
sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'
それは戻らなければならない、
bcde:cdeaf
(つまり、行の最初のコロンの前にあるすべての文字だけでなく、コロン自体も削除する必要があります。
しかし、それは何も削除しません。
私の混乱は主に次のとおりです。
1)パターンマッチングに使用される角括弧は、sed正規表現内でエスケープする必要がありますか?
2)どちらの場合も(エスケープ付き/エスケープなし)は機能しません。頑張りました。
sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
答え1
d
のコマンドはsed
行全体を削除します。ここで使用されるのはs
(代替)コマンドです。
$ echo 'abcd:bcde:cdeaf' | sed 's/[^:]*://'
bcde:cdeaf
[^:]
「コロンではない」を書く方法です。*
コロンではなく表現の後に来るのは「私の前にあるすべて」です(この場合コロンではない)。最後に、:
コロンを選択します。
一致は常に左から右への貪欲な方法で行われるため、与えられた文字列の最初の部分は最初のコロンまで一致することが保証されます。
つまり、コロンと最初のコロンではないものを好きなだけ選択してください。
//
一致する部分文字列を何もないものに置き換える(つまり、削除する)メソッドです。
答え2
列で作業するには、次のものがあります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 ;}