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


29

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

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

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

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

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


回答:


30

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

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

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

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


1
これはPOSIXではないことに注意してください。利用できるかどうかは、使用しているシェルに大きく依存します。
クリスダウン

1
その構造は、著名なシェル(少なくとも)、ksh、bash、zsh(およびその他)にあります。
ジャニス

1
@ChrisDown、まだPOSIXではありませんが、第8号に含める予定です。ksh93、bash、zsh、mksh、FreeBSD shがサポートしています。
ステファンシャゼラス

24

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

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

あなたの猫を試してみました>シェルでファイル<< 'EOF'を入力し、Enterキーを押すと、各行でこのプロンプトが表示されましたが、ctrl + xまたはctrl + zを押しても抜けられませんでした
アブドゥルアルハズレッド

1つの入力行にEOFのみを入力する必要があります
...-Rmano

2
@mikeservあなたはファセットやシリアスですか?
マシュー

1
回答のリンクが示すように、@ AbdulAlHazredは「ヒアドキュメント」と呼ばれ、非常に一般的です。ウィキペディアは、このトピックに関して適切です:en.wikipedia.org/wiki/Here_document
dave_thompson_085

1
これは私のMac OSXで機能しました(具体的echo -en 'text..'には、受け入れられた答えは改行文字(\n)を認識しませんでしたecho -enが、そうでした。
benjaminmgross17年

4

以下に、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番目の答えよりもわずかに効率的です。ただし、構文は少し複雑です。の後にスペースが必要{で、の前にセミコロンが必要}です。

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


2

さらに別のオプションを与えるには、単にヒットすることができますEnter (つまり、リテラルの改行):

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

>2行目の最初にを入力しないことに注意してください。これがセカンダリシェルプロンプト$PS2です。不完全なコマンド(この場合、引用符が一致しないコマンドなど)を入力すると、シェルが出力します。


0

POSIX 7ではできない

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

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

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

オプションのXSI拡張機能がない場合。

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

formatオペランドは、XBD File Format Notation [...]で説明されているフォーマット文字列として使用されます。

ファイル形式の表記

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

また、Ubuntu 15.10とほとんどのディストリビューションはecho両方を次のように実装していることに注意してください。

  • Bashビルトイン: help echo
  • スタンドアロンの実行可能ファイル: which echo

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


あります echoシステムで利用可能なすべてのシェルにビルトインます。Ubuntuでは、通常/ bin / shはダッシュですが、bashもデフォルトで付属しています。zsh、rc、mksh、yash、csh、tcsh、ksh93 ...はすべて、異なる動作を持つ独自のエコーを持ちます。which echoすべてのシェルでシステムエコーのパスが表示されないことに注意してください。
ステファンシャゼラス

@StéphaneChazelas「このエコーは、すべてのシェルでシステムエコーのパスを提供しません。」私が知らなかったこと、それは他に何を与えることができますか?
Ciro Santilli新疆改造中心法轮功六四事件

tcshまたはzshで試してください。 which元々(80年代に)cshユーザー専用のcshスクリプト(〜/ .cshrcからエイリアスをロード)であり、一部のシステムにはまだあります。whichzshおよびtcshに組み込まれています。
ステファンシャゼラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.