改行を使用してコンテンツをUNIX変数にファイルする


117

次の内容のテキストファイルtest.txtがあります。

text1
text2 

ファイルの内容をUNIX変数に割り当てたいのですが、これを行うと、次のようになります。

testvar=$(cat test.txt)
echo $testvar

結果は次のとおりです。

text1 text2

の代わりに

text1
text2 

誰かがこれの解決策を私に提案できますか?

回答:


184

割り当てによって改行文字が削除されることはありませecho。実際にこれが行われます。これらの改行を維持するには、文字列を引用符で囲む必要があります。

echo "$testvar"

これはあなたが望む結果を与えます。デモについては、次のトランスクリプトを参照してください。

pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2

pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2

理由改行はスペースに置き換えられている理由ではありません完全に行うにはecho、むしろ、それは物事の組み合わせだと、コマンド。

コマンドラインを指定するbashと、IFS変数のドキュメントに従って単語を単語に分割します。

IFS:拡張後の単語分割に使用される内部フィールド区切り文字...デフォルト値は<space><tab><newline>です。

これは、デフォルトで、これらの3つの文字のいずれかを使用してコマンドを個々の単語に分割できることを示しています。その後、単語の区切りはなくなり、残っているのは単語のリストだけです。

これをechoドキュメント(bash内部コマンド)と組み合わせると、スペースが出力される理由がわかります。

echo [-neE] [arg ...]:スペースで区切られたargsに続いて改行を出力します。

を使用するとecho "$x"x変数全体がに従って単一の単語になるためbash、分割されません。あなたはそれを見ることができます:

pax> function count {
...>    echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1

ここでは、count関数は指定された引数の数を出力するだけです。1 2 3およびa b c d変異体は、アクションでそれを示しています。

次に、x変数の2つのバリエーションを試してみます。1 なしの 4つのワードがあることを引用符ショー、"test""1""test""2"。引用符を追加すると、1つの単語になり"test 1\ntest 2"ます。


引用符...それは私が欠けていたものです!ありがとう!
匿名

また、注目に値する:末尾の改行は、コマンド置換演算子自体によって削除されます。オンラインで試してください
ヨナ

11

これは、改行を含むIFS(Internal Field Separator)変数が原因です。

$ cat xx1
1
2

$ A=`cat xx1`
$ echo $A
1 2

$ echo "|$IFS|"
|       
|

回避策は、一時的に改行を含まないようにIFSをリセットすることです:

$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK

IFSのこの恐ろしい変更を元に戻すには:

IFS=$IFSBAK

私はこの変更を行いましたが、今は他のものが機能していません。リセットして戻すように教えてください。
Pooja25

:あなたはそれが変数、直接ワンライナーに行く必要がない場合はecho "$(IFS=''; cat text.txt)"
カーティスYallop


3

誰かが別のオプションに興味がある場合:

content=( $(cat test.txt) )

a=0
while [ $a -le ${#content[@]} ]
do
        echo ${content[$a]}
        a=$[a+1]
done

3

変数はによって正しく設定されtestvar=$(cat test.txt)ます。改行文字で構成されるこの変数を表示するには、二重引用符を追加するだけです。たとえば、

echo "$testvar" 

ここに完全な例があります:

$ printf "test1\ntest2" > test.txt
$ testvar=$(<test.txt)
$ grep testvar <(set)
testvar=$'test1\ntest2'
$ echo "$testvar"
text1
text2
$ printf "%b" "$testvar"
text1
text2

0

envdirユーティリティは、これを行うための簡単な方法を提供します。 envdirファイルを使用して環境変数を表します。ファイル名はenv var名にマッピングされ、ファイルの内容はenv var値にマッピングされます。ファイルの内容に改行が含まれている場合は、env varも含まれます。

https://pypi.python.org/pypi/envdirを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.