- ベストアンサー
bashで変数中の改行はどのように表現するの?
- bashで変数中の改行はどのように表現するのでしょうか?
- 複数のファイルが置かれたディレクトリで、lsコマンドを用いてファイル名を取得し、配列に格納する際に、改行コードの取り扱いについて質問です。
- lsコマンドで取得したファイル名の配列要素から改行コードを取り除く方法を教えてください。
- みんなの回答 (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の中で特に処理する必要がなくなります。
その他の回答 (2)
- saijyo_739
- ベストアンサー率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です。
補足
> \nってどこかに書かれてましたか? どこに書かれていたというわけではなく、LFは\nで表現すると思い込みです。 > for LINELF in "${ary[@]}" > do > LINE=${LINELF%\ > } > done; をスクリプトにこのまま書き込んでみましたが、改行が付いています。 \を行末に置くと、次行を行の継続とする機能となるのでは? 全然わかっていないのかなぁ。
- 0909union
- ベストアンサー率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は該当する記事があるので、掲載してのであって、それが正しい記事が書かれているかは精査していません。
補足
うちの環境(Ubuntu Linux)では改行はLFであり、bashでは \n と記述すればよいと思っているのですが、どうもそうではないようで、よくわかりません。別にLFをCR+LFにしたいわけではなく、LFを取り去りたいだけなのですが。
お礼
kmeeさま、ありがとうございます。 > bashで\n等のエスケープシーケンスを使うには$'\n'という形でシングルクオートに$を付けたもので括る必要があります。 > LINE=${LINELF%$'\n' $'\n'で改行を現せることを確認しました。 > mapfile -t ary < file.txt これも確認できました。 'man bash'に書かれていたのですね。 勉強になりました。