n番目の区切り記号の前のすべての項目を印刷します。

n番目の区切り記号の前のすべての項目を印刷します。

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")}'

関連情報