エコーされた文字列間の間隔を無視します。

エコーされた文字列間の間隔を無視します。

echo次の2つのコマンドのいずれかを使用して、2つの文字列をファイルに印刷します。

echo -e "\n""x" >> ~/file
echo -e "\n" "x" >> ~/file

最初の結果は次のとおりです。

X

2番目の結果は次のとおりです。

X

余分な空間も見逃さなかったと思います。

私は2番目のコマンドが最初のコマンドと同様に動作することを最も望んでいます。"\n"との間に余分なスペースがあり、"x"コマンドをより快適に読むことができるからです。

Bash 4.3.48(1)では、これが自然に不可能であることを考えると、これを許可するか、少なくともそれに近い構文がありますか?

主な目的は、より快適に読みやすいように、2つの文字列の間にある種の分離を提供しますが、上に余分なスペースを残さない間隔、または少なくともいくつかのプレースホルダ/区切り文字を持つことです。

ご存知の様子を教えてください。私は他のものを使うことに興味がありますecho(ここでは文字列を避けることを好むが)。


「」を意味するために「文字列」という用語を使用したことに注意してください\n。ここで言うのが正しいかどうかはわかりませんが、これを説明するために使用できる最高の用語です。

答え1

次のコマンドを使用してこれを実行できますprintf

printf '\n%s\n' 'x' >file

を使用すると、スペースを削除してこれを行うことがechoできますtr

echo -e '\n x' | tr -d ' ' >file

次のように書くこともできます(ただし、そうしないでください)。

echo -e '\n' 'x' | tr -d ' ' >file

結果:

$ cat file

x

私はこれが実際にあなたが注文できると簡単に主張できると思います。もっと強く読む。

答え2

コアがスクリプトソース内の2つの文字列を視覚的に区切ることであれば、\nそれを変数に入れることができるようです。x

str1='\n'
str2='x'
echo -e "$str1$str2" >> file

もちろん、パラメータ拡張は連続的ですが、文字列自体はそうではありません。

または を使用しますprintfが、末尾の改行の追加は別途行う必要があります。

{ printf %s $'\n' 'x'; echo; } >> file

%sもちろん、バックスラッシュエスケープ文字はパラメータ文字列では拡張されませんが、Bashでは$'...'ANSI-C引用符を使用してecho最終改行文字を取得できます。

または、目的の操作を実行する関数を定義します(ここで消去されている"$*"ように、区切り文字なしでパラメータを関数に関連付けます)。IFS

output() { local IFS=; echo -e "$*"; }
output "\n" "x"

答え3

x目標がファイルに新しい行とa(そして別の改行?)を具体的に書き込むことで、and(つまり)がコマンドに連続して表示されないn場合(そして出力に不要なスペースが含まれていない場合)、次のいずれかとても簡単です。方法はxnx

{ echo; echo "x";} >> file

(改行、、x改行作成)または

{ echo; echo -n "x";} >> file

(改行文字とを書きますが、x末尾に改行文字はありません)。グループ化のために中かっこの代わりにかっこを使用することもできます。

(echo; echo "x") >> file

中かっこを使用する場合は、先頭の後にスペース(スペース、タブ、および/または改行)があり、最後の前に{1つ(および/または改行)が必要です。あるいは、2つの完全に別々の(グループ化されていない)コマンドを実行して、独立してリダイレクトを実行することもできます。;}

echo     >> file
echo "x" >> file

または使用Jesse_bの答え:

printf '\n%s\n' 'x' >> file

(改行、、x改行作成)または

printf '\n%s'   'x' >> file

(改行文字とを書きますが、x末尾に改行文字はありません)。


ただし、目標がより一般的なものである場合は、コマンドラインでスペースで区切って複数の文字列(間にスペースなし)を作成する場合は、次の点を考慮してください。

printf '%b'ひも…

印刷された文字列%bの変換形式 そして \ 配列解析%s文字列を文字通り印刷するのとは反対)たとえば、

printf '%b' '\n' foo '\t' bar

IEを書きますnewlinefootabbar

 
豊富なバー
(最後に改行文字はありません)。また、話すことができます

printf '%b%b%b%b' '\n' foo '\t' bar

しかし、そうではありません。すべてのパラメータを表示するのに必要なだけフォーマットが適用されます。したがって、末尾に改行文字を追加するには

printf '%b\n' '\n' foo '\t' bar

動作しません。各パラメータの後に改行を追加します。あなたはできます

printf '%b' '\n' foo '\t' bar '\n'

(最後の引数で改行文字を追加) または

printf '%b%b%b%b\n' '\n' foo '\t' bar

(計算パラメータ)または

{ printf '%b' '\n' foo '\t' bar; echo;}

別の方法またはbashを使用している場合

printf '%s' $'\n' foo $'\t' bar

シーケンスを解釈するには、bash表記を使用してください。これを元の問題に適用すると、$'text…'\

printf '%s' $'\n' x

答え4

%bbash printf(バックティック引数の説明)を使用できます。

$ printf  %b  \\n  x  >> file

もちろん、次のように引用することもできます\n

$ printf  %b  '\n'  x  >> file

xただし、backtickの値はprintfによって解釈されないため、printfに入力する内容には非常に注意してください。

またはbashを使用しているので、次のように改行を作成できます$'\n'

$ printf '%s' $'\n' x >>file

より安全です%b

または変数が必要な場合:

$ nl=$'\n'
$ printf '%s' "$nl" x >> file

または、次のように関数を定義できます。

$ separate() { local IFS=; printf %b "$*"; }
$ separate '\n' 'x' '*'

パラメータが一緒に接続されていることを確認してくださいlocal IFS=(間にスペースはありません)。"$*"

関連情報