web-dev-qa-db-ja.com

改行文字とは-'\ n'

これは非常に基本的な概念ですが、私はそれをうまく表現することができなかったものです。そして、私はそれを綴ってみて、どこが間違っているのかを見たいと思います。

必要に応じて、「改行文字」をどのように定義しますか。たとえば、UNIX(またはWindows)で新しいファイルを作成した場合、「改行文字」と呼ばれる特殊文字をファイルに挿入することで、ファイルに「行末」情報が格納されます。もしそうなら、そのアスキー値は何ですか? Cプログラムでは、値 '\ n'に対して読み取り文字をチェックしたことを覚えています。そして、なぜこの2文字が行末文字を表すのに混乱するのか。

bash$ cat states
California
Massachusetts
Arizona

たとえば、行の間に1行のスペースを挿入して、次の形式の出力が必要だとします。

California

Massachusetts

Arizona

bash$sed -e 's/\n/\n\n/g' states  does not work.

ここで「改行文字」を他の文字を扱い、上記のコマンドのようなものを実行するのと同じように扱うことができないのはなぜですか。 (これはsedの構文の問題であると言う人もいると思いますが、これを許可しないことの背後にある直観を説明して、混乱を取り除くことができます。

同様に、vimエディター内では:%s/\ n/\ n\n/gを使用できません。なんでそうなの?

Sedおよびvim内からバックスラッシュを使用して、\ nさらにエスケープする必要がありますか?。

おかげで、

ジャグラティ

9
xyz

sed manページ から:

通常、sedは、終了の改行文字を含まない入力行をパターンスペースに循環的にコピーし(「D」関数の後に何かが残っていない限り)、そのパターンスペースを選択するアドレスを持つすべてのコマンドを適用します。パターンスペースを標準出力に追加し、改行を追加して、パターンスペースを削除します。

改行が存在しない行で動作しているため、そこにあるパターンは一致しません。 $(行末)または^(行頭)との照合など、他のことを行う必要があります。

これは私のために働いた何かの例です:

$ cat > states
California
Massachusetts
Arizona
$ sed -e 's/$/\
> /' states
California

Massachusetts

Arizona

sed行の\の後にリテラルの改行文字を入力しました。

11
Carl Norum

NewLine(\ n)は10(0xA)で、CarriageReturn(\ r)は13(0xD)です。

オペレーティングシステムが異なれば、ファイルの行末表現も異なります。 WindowsはCRLF(\ r\n)を使用します。 UnixはLF(\ n)を使用します。古いMac OSバージョンはCR(\ r)を使用しますが、OS XはUnix文字に切り替えました。

これは比較的便利です [〜#〜] faq [〜#〜]

11
i_am_jorf

エスケープ文字は、システムがそれらを解釈するものに依存しています。 \nは多くのプログラミング言語で改行文字として解釈されますが、これはあなたが言及している他のユーティリティには必ずしも当てはまりません。彼らが扱っていても\n改行として、あなたが望むようにそれらを動作させるためのいくつかの他のテクニックがあるかもしれません。あなたは彼らのドキュメントを調べる必要があります(またはここで他の答えを見てください)。

DOS/Windowsシステムでは、改行は実際には2文字です:復帰(ASCII 13、AKA \r)、その後に改行(ASCII 10)。 Unixシステム(Mac OSXを含む)では、それは単なる改行です。古いMacでは、これは単一のキャリッジリターンでした。

5
Cogwheel
sed 's/$/\n/' states
3
Johan

私は this Jeff Attwoodによる投稿があなたの質問に完璧に対処していると思います。 Dos、Mac、Unixの改行の違いについて説明し、CR(改行)の履歴とLF(改行))について説明します。

1
Corina

sedを複数行検索および置換モードにして、改行文字を一致させることができます\n

これを行うには、sedは最初にファイルまたは文字列全体をホールドバッファー(「ホールドスペース」)に読み込んで、ファイルまたは文字列の内容を「パターンスペース」の単一行として扱うことができるようにする必要があります。

単一の改行を移植可能に置き換えるには(GNUおよびFreeBSD sedに関して))、エスケープされた「実際の」改行を使用できます。

# cf. http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/
echo 'California
Massachusetts
Arizona' | 
sed -n -e '
# if the first line copy the pattern to the hold buffer
1h
# if not the first line then append the pattern to the hold buffer
1!H
# if the last line then ...
$ {
# copy from the hold to the pattern buffer
g
# double newlines
s/\n/\
\
/g
s/$/\
/
p
}'

# output
# California
#
# Massachusetts
#
# Arizona
#

ただし、同じ結果を実現する方がはるかに便利です。

echo 'California
Massachusetts
Arizona' | 
   sed G
1
cahn

これを試して:

$ sed -e $'s/\n/\n\n/g' states
0
Adrian

Sedの回答はたくさんありますが、vimにはありません。公平を期すために、vimの改行文字の扱いは少し混乱しています。検索する \n と置き換えます \r。 RTFMをお勧めします::help pattern一般的に:help NL-used-for-Nul 特に。

:substituteコマンドで必要なことを行うには、

:%s/\_$/\r

ほとんどの人は次のようなものを使うと思いますが

:g/^/put=''

同じ効果のため。

ここにあなた自身のための答えを見つける方法があります。標準のvimディストリビューションの一部であるxxdを介してファイルを実行します。

:%!xxd

あなたが得る

0000000: 4361 6c69 666f 726e 6961 0a4d 6173 7361  California.Massa
0000010: 6368 7573 6574 7473 0a41 7269 7a6f 6e61  chusetts.Arizona
0000020: 0a                                       .

これは、46が16進数コードであることを示しています。 C、61は a、 等々。特に、0a(10進数の10)は、 \n。キックのためだけに、試してみてください

:set ff=dos

xxdでフィルタリングする前。ラインターミネータとして0d0a(CRLF)が表示されます。

:help /\_$
:help :g
:help :put
:help :!
:help 23.4
0
benjifisher