スペルエラーがある場合は、バージョン管理を容易にするために、各文に別々の行に複数の(マークダウン)テキストがあるとします。例file.txt
:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Dictum sit amet justo donec enim diam vulputate.
Nunc faucibus a pellentesque sit amet.
Quis enim lobortis scelerisque fermentum dui faucibus in.
Leo duis ut diam quam nulla porttitor massa id neque.
Vitae tortor condimentum lacinia quis vel eros.
次のように各段落を1行に変換するにはどうすればよいですか?
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Dictum sit amet justo donec enim diam vulputate. Nunc faucibus a pellentesque sit amet.
Quis enim lobortis scelerisque fermentum dui faucibus in. Leo duis ut diam quam nulla porttitor massa id neque. Vitae tortor condimentum lacinia quis vel eros. Velit euismod in pellentesque massa placerat duis ultricies lacus.
\n
私の考えは、ピリオドとスペース以外の文字の間の.
改行文字を見つけて置き換えることです\S
。 regex101でこれを行う方法を見つけました。ここしかし、私のbashシェルで使用できるより短いtr / sed / awkがあるかどうか疑問に思います。それはまるでcat file.txt | ???
ベストアンサー1
perl
短絡モードが渡されました。-00
perlrun
input
フラグなので、すべての内部改行文字を空白に置き換えると次のようになります。
$ wc -l input
7 input
$ perl -00 -pe 's/\n(?!\Z)/ /g' input | wc -l
3
$
ビット(?!\Z)
は、各段落の終わりで改行を変更せずに段落境界を維持することです。
別のオプションはですlex
。これは、いくつかのトリッキーな問題、特にEOF
POSIXが要求するように最終改行文字を処理する方法と常に含めるかどうか、および段落定義(正確に2つの改行文字ですか、それとも任意の数字ですか?)を明らかにします。
%%
[\n][\n]+ { printf("%s", yytext); }
\n { int c = input();
/* TODO book docs say this should return EOF on EOF ?? */
if (c == 0) {
putchar('\n');
yyterminate();
} else {
printf(" %c", c);
}
}
<<EOF>> { putchar('\n'); yyterminate(); }
%%
int main(int argc, char *argv[])
{
return yylex();
}
それ以上が必要な場合があります
$ make paranlneg
lex -o lex.paranlneg.c paranlneg.l
egcc -O2 -pipe -o paranlneg lex.paranlneg.c -ll
rm -f lex.paranlneg.c
$ perl -E 'say "a\nb\n\nc\nd"' | ./paranlneg
a b
c d
$