解決済み

bashで変数中の改行はどのように表現するの?

  • 暇なときにでも
  • 質問No.6733547
  • 閲覧数3993
  • ありがとう数1
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 56% (87/154)

複数のファイルが置かれたディレクトリで(bashで)
$ ls > file.txt
$ mapfile ary < file.txt
とすると、各ファイル名を要素とする配列が変数aryに入ります。
この時、各配列要素にはファイル名だけでなく、file.txtの各行の改行コードが含まれます。
(参考 http://emasaka.blog65.fc2.com/blog-entry-560.html

この配列要素から改行コードを取り除くべく

for LINELF in "${ary[@]}"
do
LINE=${LINELF%\n}
done;

としても改行コードを取り除けません。


for LINELF in "${ary[@]}"
do
LINE=${LINELF%?}
done;
とすれば取り除けるので実害はないのですが、変数の値の中の改行コードはどのように表現するのでしょうか?

2011年5月12日

質問者が選んだベストアンサー

  • 回答No.3

ベストアンサー率 55% (1857/3366)

bashで\n等のエスケープシーケンスを使うには$'\n'という形でシングルクオートに$を付けたもので括る必要があります。

LINE=${LINELF%$'\n'}


ただ、mapfileのマニュアル(bashの内部コマンドなので、 man bash の中にある)を見ると

> mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
> readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
(略)
> -t Remove a trailing newline from each line read.
(訳: 各入力行から、最後の改行を取り除く)

とあります。つまり、今回の目的なら
mapfile -t ary < file.txt
とすればforの中で特に処理する必要がなくなります。
お礼コメント
RASUM2

お礼率 56% (87/154)

kmeeさま、ありがとうございます。
> bashで\n等のエスケープシーケンスを使うには$'\n'という形でシングルクオートに$を付けたもので括る必要があります。

> LINE=${LINELF%$'\n'

$'\n'で改行を現せることを確認しました。


> mapfile -t ary < file.txt
これも確認できました。
'man bash'に書かれていたのですね。

勉強になりました。
投稿日時 - 2011-05-14 00:01:01
Be MORE 7・12 OK-チップでイイコトはじまる

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 53% (119/222)

> この配列要素から改行コードを取り除くべく
>
> for LINELF in "${ary[@]}"
> do
> LINE=${LINELF%\n}
> done;

\nってどこかに書かれてましたか?


for LINELF in "${ary[@]}"
do
LINE=${LINELF%\
}
done;

上記で良さそうですね。

※ 説明 \の後ろの \n が文字として${LINELF%\[次の文字の機能を抑止し文字として書いた事にする]\n
}

って解釈されると思いますので、それでやりたい事が実現できるのでは?

例えば
kaigyoiri="ABC abc
"
とすれば、$kaigyoiriの内容は"ABC abc\n"になりますし、\n入れたければ多くの端末では Ctrl-v Ctrl-mで\rが入ります。(表示は ^M )
※ vi で文字としてCRを入れる場合には使えます。
EmacsだとCtrl-q Ctrl-mです。
補足コメント
RASUM2

お礼率 56% (87/154)

> \nってどこかに書かれてましたか?
どこに書かれていたというわけではなく、LFは\nで表現すると思い込みです。

> for LINELF in "${ary[@]}"
> do
> LINE=${LINELF%\
> }
> done;
をスクリプトにこのまま書き込んでみましたが、改行が付いています。
\を行末に置くと、次行を行の継続とする機能となるのでは?

全然わかっていないのかなぁ。
投稿日時 - 2011-05-13 23:53:46
  • 回答No.1

ベストアンサー率 39% (325/818)

テキストを何であるかを判断するのには難しい問題があり、該当する文字コードで類推する方法しか今のところありません。

まず、自分の環境が、何の環境なのか理解する事です。例えば、

http://w3.kcua.ac.jp/~fujiwara/infosci/jpchar.html

のような事があります。UNIX系ではLF(ラインフィールド)と言うことですね。しかし、日本語環境だと、これ以外にもはります。

http://search.yahoo.co.jp/search?b=1&n=10&ei=UTF-8&fr=ie8sc&p=SH+LF%E3%82%92%E5%89%8A%E9%99%A4

と言うことです。この手の文献をよんで、環境に合わせて、フィルタリングするしかないでしょう。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46865&forum=10
http://shellscript.sunone.me/filter_sed.html

なお、リストしたURLは該当する記事があるので、掲載してのであって、それが正しい記事が書かれているかは精査していません。
補足コメント
RASUM2

お礼率 56% (87/154)

うちの環境(Ubuntu Linux)では改行はLFであり、bashでは \n と記述すればよいと思っているのですが、どうもそうではないようで、よくわかりません。別にLFをCR+LFにしたいわけではなく、LFを取り去りたいだけなのですが。
投稿日時 - 2011-05-13 23:40:24
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
このQ&Aのテーマ

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ