2

テキストの「ブロック」を、ファイルの先頭、改行、またはファイルの終わりの間のすべての行として定義します。

block1
block2
block3

anotherblock4
anotherblock5
anotherblock6

lastblock7
lastblock8

どのテキストもブロックを占めることができます-どの行がそこにあるかは不明です。2番目のブロックに改行を挿入するシェルスクリプトを作成しようとしましたが、sedは改行を操作するのが好きではないため、このsedワンライナーをハッキングしました。

sed -n "H;\${g;s/\n\n/\nTEST\n\n/2;p}"

これにより、次のようになります。

[newline]
block1
block2
block3

anotherblock4
anotherblock5
anotherblock6
TEST

lastblock7
lastblock8

問題は、バッファの先頭に改行を追加することです(StackOverflowのマークアップでは表示できないため、[newline]とマークされています)別のツールまたは別の正規表現を使用してそれを行う別の方法はありますか?

4

4 に答える 4

2

newlineこれはあなたが望むことを行い、最初に不要なものを取り除きます:

sed -n "1{x;d};H;\${g;s/\n\n/\nTEST\n\n/2;p}"
于 2009-07-08T04:26:51.253 に答える
1

ここに1つの可能な解決策があります

awk '/^$/{f++}f==2{print "TEST\n";f=0;next}1' file
于 2009-07-08T01:21:13.577 に答える
0

もう1つのawk解決策。これはawk、ghostdog74 のソリューションのように自分で段落を数え​​るのではなく、段落を追跡するように求めます。

awk -v 'RS=\n\n' '{print}NR==2{print"TEST"}{print""}'
于 2009-07-08T15:17:24.507 に答える
0

わかりました、これは私の最も誇りに思う瞬間ではありませんが、あなたが望むものになると思います...多分?sed少なくとも私のマシンでは、s/x/y置換コマンドで改行を操作するのが好きではないため、役に立つことは何もできませんでした。

# 猫ブロック
ブロック1
ブロック2
ブロック3

別のブロック4
別のブロック5
別のブロック6

lastblock7
lastblock8
# python -c 'import sys,re; print re.sub("(\n\n[\s\S]*?\n)(\n)", "\\1TEST\n\\2", sys.stdin.read(), 1), ' < ブロック
ブロック1
ブロック2
ブロック3

別のブロック4
別のブロック5
別のブロック6
テスト

lastblock7
lastblock8

ノート:

  • の「 2 番目sedの一致を置き換える」オプションに相当するものはないため、より複雑な正規表現が必要でした。
  • .改行と一致しないため、[\s\S].
  • 非貪欲に?なります。*
  • の 4 番目のパラメーターは、1これを 1 つの置換に制限します。
  • 最後のコンマはprint、余分な改行を追加することを禁止します。

| tail +2または、出力の最初の行を切り取るために、ほぼ正しいsedコマンドの後に" " を追加することもできます。

于 2009-07-08T01:20:35.667 に答える