sed
私は次の解決策を探しています。n番目の区切り文字の後のすべての項目を印刷します。
sed -E 's/^([^\]*[\]){3}//' infile
ただし、例のように、n番目の区切り文字を抽出するのではなく、n番目の区切り文字の前のテキストを抽出します。すべてのsedバリアントで動作することです。例のように、すべての行に対して実行します。
この例の区切り記号は、\
別の区切り記号である可能性があります。すべてのバージョンのsedで動作する必要があります。
答え1
なぜそれを使用しないのですかcut
?
cut -d '\' -f 1-3 infile
一致を削除するのではなく、を使用してそれらをsed
キャプチャし、逆参照を使用して行全体をキャプチャされたグループに置き換えます。
sed -E 's/(^([^\]*[\]){3}).*/\1/' infile
これは末尾のバックスラッシュも印刷しますが...これを防ぐために、以下を実行できます。
sed -E 's/(^([^\]*[\]){2}[^\]*).*/\1/' infile
答え2
短い awk:
awk NF=3 FS='\\' OFS='\\'
- 入力および出力フィールド区切り記号の定義
- 保持するフィールド数の設定
答え3
n番目の区切り文字を改行文字に置き換えてから(そうでなければ改行文字がパターンスペースに表示されない)、改行文字で始まるすべての項目を削除できます。 n==3 の場合:
sed 's/delim/\
/3; P; d'
または、出力でn番目の区切り文字を維持する必要がある場合:
sed 's/delim/&\
/3; P; d'
n区切りなしで行をスキップするには、次の手順を実行します。
sed -n 's/delim/\
/3; t1
d; :1
P'
答え4
使用awk
:
$ awk -v var=3 'BEGIN{FS=OFS="\\"}
(NF>=var){ split($0,arr,OFS);
$0="";
for (i=1; i<=var; ++i) $(NF+1)=arr[i];
print}'
n番目の区切り文字を保持するには、次のコマンドを使用できます。
$ awk -v var=3 'BEGIN{FS=OFS="\\"}
(NF>=var){ for (i=1; i<=var; ++i) printf "%s%s", $i, OFS; print ""}'
$ nawk '(match($0, /^([^\\]*[\\]){3}/))
{ print substr($0,RSTART,RLENGTH)}'
そしてGNU awk
:
次のコマンドは、キャプチャされたグループの逆参照を使用します。これは、以下から取得したawkコマンドです。この回答。 @don_crissti ありがとう
$ awk -F "\\" -v col=3 '(NF>=col){print gensub(/(^([^\\]*[\\]){3}).*/, "\\1", "g")}'