web-dev-qa-db-ja.com

コントロールリターンを削除し、1つのテキストファイルの行をマージして、文字数を制限する

コントロールリターンを削除し、1つのテキストファイルの行をマージして、文字数を制限したい

input.txtを含む:

comment 1
comment 2 
...
comment n 

output.txt 1つの文字列が必要です:

comment 1 comment 2 ... commnet n

ただし、ouput.txtは32文字に制限する必要があります:

comment 1 comment 2 comment 3 co

Sed、awk trなどを使用できますか?

1
head -c 32 input.txt | tr '\n' ' ' > output.txt
  • head -c 32は、最初の32バイトを除くすべてを破棄します。

  • tr '\n' ' 'は、すべての改行文字をスペース文字に置き換えます。

マルチバイト文字エンコードの場合にbytesの代わりにcharactersを制限したい場合は、代わりにgrepを使用できます:

tr '\n' ' ' < input.txt | grep -oEe '^.{,32}' > output.txt
1
David Foerster

Awkは大丈夫です。 1つの方法は次のとおりです。

$ echo -n "comment 1\rcomment 2\r...\rcomment n\r" > input.txt
$ cat input.txt | awk -v FS="" -v RS="" '{for (i=1;i<=32;i++) printf ($i == "\r")? "" : $i}' > output.txt
$ cat output.txt 
comment 1comment 2...comment 

説明:デフォルトでは、awkは入力を行ごとに処理し、recordと呼ばれる1行で処理します。すべての行が列ごとに処理され、fieldと呼ばれる単一の列があります。すべてのfieldは、1で始まる変数によって参照されます。 $ 1、$ 2、$ 3…

[〜#〜] f [〜#〜] ield [〜#〜] s [〜#〜] eparator to ""。これにより、awkは文字ごとにスタッフを処理します。次に、[〜#〜] r [〜#〜] ecord [〜#〜] s [〜#〜] eparatorを""に設定します。すべてのテキストの文字を一度に参照します(つまり、行ごとに処理するコードを記述することなく)

最後に、文字を簡単に操作できるため、フィールド(つまり文字)をループし、文字がキャリッジリターンでない場合にのみ印刷します。

0
Hi-Angel
tr '\n' ' ' < in.txt | cut -c -32
  • tr '\n' ' ':入力テキストから新しい行を削除します
  • cut -c -32:出力を32文字に制限します
0
George Udosen