電子書籍の厳選無料作品が豊富!

複数のファイルが置かれたディレクトリで(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日

A 回答 (3件)

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の中で特に処理する必要がなくなります。
    • good
    • 0
この回答へのお礼

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

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

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


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

勉強になりました。

お礼日時:2011/05/14 00:01

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


>
> 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です。

この回答への補足

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

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

全然わかっていないのかなぁ。

補足日時:2011/05/13 23:53
    • good
    • 0

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



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

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

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

http://search.yahoo.co.jp/search?b=1&n=10&ei=UTF …

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

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
http://shellscript.sunone.me/filter_sed.html

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

この回答への補足

うちの環境(Ubuntu Linux)では改行はLFであり、bashでは \n と記述すればよいと思っているのですが、どうもそうではないようで、よくわかりません。別にLFをCR+LFにしたいわけではなく、LFを取り去りたいだけなのですが。

補足日時:2011/05/13 23:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!