7

私は初心者ですsed。コマンド(またはコマンドのセット)をそのような特定の範囲の行に適用することが可能であることを私は知っています

sed '/[begin]/,/[end]/ [some command]'

ここ[begin]で、は範囲の開始行を指定する正規表現であり、は[end]範囲の終了行を指定する正規表現です(ただし、範囲に含まれます)。

これを使用して、ファイル内の行の範囲を指定し、それらすべてを1行に結合しようとしています。これが私の最善の試みですが、うまくいきませんでした:

sed '/[begin]/,/[end]/ {
N
s/\n//
}
'

必要な行のセットを問題なく選択できますが、すべてを1行にマージすることはできません。誰かが私を正しい方向に向けることができれば、私は本当に感謝しています。

4

3 に答える 3

5

使用する1つの方法GNU sed

sed -n '/begin/,/end/ { H;g; s/^\n//; /end/s/\n/ /gp }' file.txt
于 2012-09-24T04:27:53.880 に答える
2

いくつかの行を選択してそれらを結合したい場合、これは簡単です。スティーブの答えまたは私のパイプからtrへの代替手段を使用してください:

sed -n '/begin/,/end/p' | tr -d '\n'

他の行も保持したい場合は、少しトリッキーになります。これが私がそれを行う方法です(GNU sedを使用):

join.sed

/\[begin\]/ {
  :a
  /\[end\]/! { N; ba }
  s/\n/ /g
}

したがって、ここでのロジックは次のとおりです。

  1. 行が検出されたら[begin]、ループを使用してパターン スペースに行を収集し始めます。
  2. 見つかったら[end]、収集を停止して列に参加します。

例:

seq 9 | sed -e '3s/^/[begin]\n/' -e '6s/$/\n[end]/' | sed -f join.sed

出力:

1
2
[begin] 3 4 5 6 [end]
7
8
9
于 2012-09-24T09:24:41.407 に答える
1

私はあなたの質問が好きです。私もSedが好きです。残念ながら、Sedであなたの質問に答える方法がわかりません。だから、あなたのように、私はここで答えを探しています。

Sedの回答はまだここに表示されていないため、Perlでそれを行う方法は次のとおりです。

perl -wne 'my $flag = 0; while (<>) { chomp; if (/[begin]/) {$flag = 1;} print if $flag; if (/[end]/) {print "\n" if $flag; $flag = 0;} } print "\n" if $flag;'
于 2012-09-24T04:08:03.790 に答える