web-dev-qa-db-ja.com

echoコマンドとリダイレクト演算子を使用して改行特殊文字をファイルに入れる方法は?

Echoコマンドとリダイレクト演算子を使用してファイルを作成したいのですが、ファイルは数行で構成する必要があります。

文字列内に「\ n」で改行を含めようとしました:

echo "first line\nsecond line\nthirdline\n" > foo

しかし、この方法では、3行のファイルは作成されませんが、1行と文字列の逐語的な内容のみのファイルが作成されます。

このコマンドだけを使用して、数行のファイルを作成するにはどうすればよいですか?

33
Abdul Al Hazred

echoコマンドでいくつかの構文を使用するように求めました:

echo $'first line\nsecond line\nthirdline' > foo

(しかし、あなたが得た他の答えも考慮してください。)

$'...'構文は、埋め込まれたANSIエスケープシーケンスを展開します。

35
Janis

エコーが文字エスケープで行うのは、実装定義です。エコーの多くの実装(最新のものを含む)では、渡された文字列はデフォルトでエスケープについてまったく検査されません。

GNU bash(組み込みとして)によって提供されるエコー、および他のいくつかのエコーバリアントを使用すると、次のようなことができます。

echo -en 'first line\nsecond line\nthird line\n' > file

ただし、実際にはprintfが必要だと思います。これは私の目には読みやすく、移植性も高くなっています(この機能はPOSIXで定義されています)。

printf '%s\n' 'first line' 'second line' 'third line' > file

hereドキュメント の使用も検討してください。

cat > file << 'EOF'
first line
second line
third line
EOF
31
Chris Down

echoコマンドを使用して複数行のファイルを作成する他のいくつかの方法を次に示します。

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

ここで、2番目と3番目のコマンドは>>リダイレクト演算子を使用します。これにより、コマンドの出力がファイル(この時点で既に存在しているはずです)に追加(追加)されます。

または

(echo "first line"; echo "second line"; echo "third line") > foo

ここで、括弧はechoコマンドを1つのサブプロセスにグループ化します。これは、複数の行を出力する単一のプログラム(lsなど)のように見え、動作します。

上記の微妙なバリエーションは

{ echo "first line"; echo "second line"; echo "third line";} > foo

これは、サブプロセスを作成しないという点で、2番目の回答よりも少しより効率的です。ただし、構文は少しトリッキーです。{の後にスペースを入れ、}の前にセミコロンを付ける必要があることに注意してください。

詳細については、 シェルの制御およびリダイレクト演算子とは を参照してください。

5
Scott

さらに別のオプションを与えるには、 Enter (つまり、文字通りの改行):

$ echo "the rain in spain
> falls mainly on the plain" > foo

2行目の先頭に>を入力しないことに注意してください。これが2番目のシェルプロンプト$PS2であり、不完全なコマンド(この場合、一致しない引用文字を含むコマンドなど)を入力するとシェルが出力します。

2
gardenhead

POSIX 7はできないと言っています

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-eは定義されておらず、バックスラッシュは実装で定義されています。

最初のオペランドが-nの場合、またはいずれかのオペランドに<backslash>文字が含まれている場合、結果は実装定義です。

オプションのXSI拡張機能がない限り。

代わりに printf を使用してください:

formatオペランドは、XBDファイル形式表記[...]で説明されている形式文字列として使用されます。

ファイル形式表記

\ n <改行>印刷位置を次の行の先頭に移動します。

また、Ubuntu 15.10とほとんどのディストリビューションはechoを次のように実装しています:

  • bash組み込み:help echo
  • スタンドアロンの実行可能ファイル:which echo

混乱を招く可能性があります。