Linuxを使用して段落を分離する

Linuxを使用して段落を分離する

リンク段落を含むテキストファイルがあります。各段落を空行で区切る必要があります。各段落は>FP0パターンで始まる必要がありますが、段落は互いに接続されているため、現在のファイルの行の先頭にはパターンが見つかりません。sedコマンドを試しましたが、>FP0パターンを含む行に基づいて区切りましたが、新しい段落の先頭には表示されません。

段落例

>FP004340TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT>FP00598AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA>FP005521GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

使用されたsedコードは

sed '/>/s/^/\n/'

出力は次のとおりです

>FP004340TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

TTT>FP00598AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

A>FP005521GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

(新しい段落の開始時に> FP0の前に文字は必要ありません。)

答え1

代わりにPerlを使用できます。

$ perl -pe 's/>/\n\n>/g' file


>FP004340TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

>FP00598AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

>FP005521GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

ただし、ファイルの最初の文字がある場合は、その前に他の文字がある場合>にのみ置き換えることを制限できます。>

$ perl -pe 's/(.)>/$1\n\n>/g' file
>FP004340TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

>FP00598AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

>FP005521GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

またはGNUを使用してくださいsed

$ sed -E 's/(.)>/\1\n\n>/g' file
>FP004340TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

>FP00598AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

>FP005521GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

そして、次のようにsed

sed 's/\(.\)>/\1\
\
>/g' file
>FP004340TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

>FP00598AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

>FP005521GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

答え2

スクリプトsedはin itを含むすべての行を検索しますが、行の先頭に改行文字を追加します(正規表現では>これが意味するものです)。^

おそらくこれを試してみてください。

sed 's/>/\n&/g' file

ただし、\nリテラル改行が生成されるかどうかはsedバージョンによって異なります。必要な動作は多くのLinuxプラットフォームで一般的ですが、同じではありません。 (どのディストリビューションおよび/またはバージョンを明確にするか、sedAwkやPerlなどのより移植可能なソリューションを試してください。)

awk -F '>' 'BEGIN { OFS="\n>" } { $1=$1 } 1' file

ハッキングは{ $1 = $1 }awk が行を分割するように強制します。行に何も変更されない場合は、単に入力を出力にコピーして処理を最適化しますが、これは何かが変更されたと思います。

複数の改行が必要な場合は、各新しい行の前に空白行を取得するには、明らかに\n2つ以上の変更を入力してください。\n\n

答え3

GNU sed

$ sed 's/>/\n\n&/2g' input_file

POSIXly sed

sed -e '
  y/>/\n/
  s/\n/>/
  s//&&>/g
' input_file

$ perl -pe 's/(?<!^)(?=>)/\n\n/g' input_file
awk -v RS=">" -v ORS= '
NR>1&&sub(/^/,(!k++ ? ORS : "\n\n") RS)
' input_file

関連情報