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

このQ&Aのポイント
  • bashで変数中の改行はどのように表現するのでしょうか?
  • 複数のファイルが置かれたディレクトリで、lsコマンドを用いてファイル名を取得し、配列に格納する際に、改行コードの取り扱いについて質問です。
  • lsコマンドで取得したファイル名の配列要素から改行コードを取り除く方法を教えてください。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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の中で特に処理する必要がなくなります。

RASUM2
質問者

お礼

kmeeさま、ありがとうございます。 > bashで\n等のエスケープシーケンスを使うには$'\n'という形でシングルクオートに$を付けたもので括る必要があります。 > LINE=${LINELF%$'\n' $'\n'で改行を現せることを確認しました。 > mapfile -t ary < file.txt これも確認できました。 'man bash'に書かれていたのですね。 勉強になりました。

その他の回答 (2)

回答No.2

> この配列要素から改行コードを取り除くべく > > 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
質問者

補足

> \nってどこかに書かれてましたか? どこに書かれていたというわけではなく、LFは\nで表現すると思い込みです。 > for LINELF in "${ary[@]}" > do > LINE=${LINELF%\ > } > done; をスクリプトにこのまま書き込んでみましたが、改行が付いています。 \を行末に置くと、次行を行の継続とする機能となるのでは? 全然わかっていないのかなぁ。

  • 0909union
  • ベストアンサー率39% (325/818)
回答No.1

テキストを何であるかを判断するのには難しい問題があり、該当する文字コードで類推する方法しか今のところありません。 まず、自分の環境が、何の環境なのか理解する事です。例えば、 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
質問者

補足

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

関連するQ&A

  • bashで変数を含んだファイル読み込み

    お世話になります。 外部読み込みファイルの中に変数やコマンドをセットして利用したいのですが、それはできないのでしょうか? ----test.txt messages-${testdate} `hostname`.log -------------------------- ----test.sh testdate=`date +%Y%m%d` for line in `cat test.txt` do echo $line done -------------------------- ----出力 messages-${testdate} `hostname`.log -------------------------- ----望む出力結果 messages-20150521 servername.log -------------------------- 方法がございましたら、ご教授お願い致します。

  • 改行入り変数を改行を残したまま改行区切りで配列に入れる方法

    file()関数と同様の事を、ファイル名を指定ではなく変数名を指定して行いたいのですが、explode()関数だと改行(区切り文字)は削除されて配列に格納されてしまいます。とりあえず以下の2つの方法しか思いつかないのですが、どちらが効率的でしょうか? 又、他にもっと良い方法ありましたら教えて欲しいです。お願いします。 方法1 explode後、配列を再ループし末尾に改行コードを付与 方法2 strstrとsubstrで変数をカットしながら配列に格納

    • 締切済み
    • PHP
  • SHELLの変数代入について

    変数名に変数を使うとエラーになるのですが、 変数名に変数を入れることは可能なのでしょうか? #!/bin/sh #関数の初期化 for i in 0 1 2 3 4 5 6 7 8 do kannsuu${i}=0 done #終わり OS:solaris10 よろしくお願いします

  • bashで変数を可変させたい

    /homeの中にあるフォルダaaa、bbb、cccのサブフォルダの容量を取得し、結果をそれぞれ、 /root/batchの中にaaa、bbb、cccというファイル名で出力。 そのファイルをcatで出力し、結果をmbox_#(#は数字)という変数に保存するバッチを作成したいと四苦八苦しながら作業を行なっております。 バッチを実行しますと、以下のようなエラーが出力されます。 ./abcde.sh: line 16: mbox_1=62: command not found ./abcde.sh: line 16: mbox_2=1: command not found ./abcde.sh: line 16: mbox_3=1: command not found mbox_#の#を可変させたいのですが、何か良い記述方法はございますでしょうか? ==以下バッチ内容== #!/bin/sh Path1=/home Path2=/root/batch n=0 for box in aaa bbb ccc do n=$[$n+1] for var in `ls $Path1/$box` do du -sm $Path1/$box/$var >> $Path2/$box done 'mbox_'$n=`cat $Path2/$box` done お手数をおかけしますが、宜しくお願い致します。

  • Bシェルで不定変数名を変数として取り扱うには

    ファイル(test.txtとします)に 0755 $HOGE/herehere $FOO/bar のような形で変数を示す文字列がはいっています。 どんな変数名かは事前にわかりません。 これをシェルプログラムで、 $が付いていたら変数名と解釈して使用したいです。 どんな変数名がファイルに含まれているかがわかっているなら、 以下のようにできたのですが、 変数名が不明のときにはどうしたらファイルに含まれている変数を そのまま使用できるのでしょうか。 HOGE=`command HOGE` #HOGEを引数にcommandコマンドを呼び出した結果を$HOGEとする FOO=`command FOO` #↑test.txtの中には$HOGEや$FOOが何度も出てくるので、 #出てくるたびにcommandコマンドを使うのは避けたい。 while read LINE do  FILE=`echo $LINE|sed "s%"'$HOGE'"%$HOGE%g"` done < /test.txt

  • 改行を行わない書き込みメソッド

    Rubyを使用しています。 いま,f = File.open(・・・)として, そこにある変数a, b, c, ・・・を同じ行に入力してしようとしています。 そこで,ary = [a, b, c, ・・・]という配列を作成し, f.puts ary と書いててみたのですが上手に行きません。 というのも,putsでは自動的に改行されてしまって, a,b,c・・・がそれぞれ別の行に入力されてしまうためです。 改行を行わずに書き込みを行う方法を教えていただけないでしょうか? お願いします。

  • スカラー変数中の改行コードでセパレーションしたい。

    複数行に渡る文字列を含むデータをスカラー変数に格納したのですが 格納後にこれを改行コード(\n)をセパレータとして配列に分けたいと思っています。 データ(abc.txtd)は aaaaaa bbbbbb cccccc といったものです。 $data = "abc.txt"; @array = split (/\n/, $data); としてもうまく配列に分割してもらえないのですが、どうすればよいのでしょうか。 基本的な質問で申し訳ありませんが、どなたかよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • bashスクリプトでの配列参照

    bashスクリプトでの質問です。 配列を、ループ文で順に参照しようとしているのですが、 要素を変数で記述すると、うまく参照できなく困っております。 ---------------------------------------------- i=0 j=10 while $i -le $j do echo "${hoge[$i]} ${huga[$i]}" i=`expr $i + 1` done ----------------------------------------------- こんな感じの、スクリプトなのです。 要素を直接記述すると、ちゃんと中身を参照することができました。 やりたいことは、二つの配列の同じ要素の中身を、連結して表示するといったものです。 ご教授よろしくお願いします。

  • bash forコマンドでソート

    bash forコマンドでソート CentOS8 bashの forコマンドで、ディレクトリ内のファイル名を部分指定した降順でソートした状態で順次読み込みしたいです。 <ファイル> aaa.dat bbbb_0001.dat TEST_0001.file TEST_0002.file TEST_0003.file <アウトプット> TEST_0003.file TEST_0002.file TEST_0001.file 基本的な読込と、lsコマンドの結果を基に読み込む方法はわかりましたが、これに降順ソートを加えるにはどうすれば良いでしょうか? <基本的な読込> for file in /dir1/TEST_*.file do echo $file done <lsコマンドの結果を基に読込> for file in $(ls /dir1/TEST_*.file) do echo $file done

  • バッチファイルで変数の内容変更

    以下のバッチファイルで,10回目のループで,ファイル名を入力している変数を 「out.txt」と変更したいのですが,変更前の「in.txt」と 出力されてしまいます。 どのように対処すれば宜しいでしょうか? よろしくお願いします。 @echo off set FLN=in.txt for /L %%N in ( 1 , 1 , 10 ) do ( echo %%N if "%%N" equ "10" ( echo 変更します set FLN= set FLN=out.txt ) echo %FLN% ) @echo on