trを使用して変数を再割り当てし、改行とキャリッジリターンを削除します。

trを使用して変数を再割り当てし、改行とキャリッジリターンを削除します。

特定の文字列を変数(v1)にロードします。新しい行とキャリッジリターンを引いたこの変数と同じ新しい変数を定義したいので、新しい変数が割り当てられた文字列から新しい行とキャリッジリターンを削除する必要があります。

これは私がやろうとしていることの例です(-->は端末出力を意味します)。

v1="Hello\nThere" 

v2=  $(echo $v1 | tr -d '/n')  #This yields the error below.
--> bash: Hello\nThere: No such file or directory

同様に、「/n」の代わりに「l」を置き換えようとすると、次のような結果が表示されます。

v2=  $(echo $v1 | tr -d l)
--> bash: Heo\nThere: No such file or directory 

2番目の例では、「l」は消えますが、「該当するファイルやディレクトリはありません」というメッセージが表示されますが、何が意味するのかわかりません。この場合、これはどういう意味ですか?どのファイルやディレクトリを探していますか? echo 結果を tr に送信します。 「該当するファイルやディレクトリがありません」というメッセージが表示された場合、それが何を意味するのかわかりません。

また、新しい変数を割り当てずにこれを行うと機能します。

echo $v1 | tr -d l
-->   Heo\nThere

ここに新しい変数を正しく割り当てていますか?私が使用する形式はVariableName = $(expression)です。

ベストアンサー1

v1="Hello\nThere" 

まず、途中にバックスラッシュがある文字通りv1文字列に設定されます。Hello\nThereリテラル改行を含めるには(Bash / Ksh / Zshで)、次のように使用できます。

v1=$'Hello\nThere'

または(POSIXly):

v1='Hello
There'

それでは、次のようになります。

v2=  $(echo $v1 | tr -d '/n') 

これは、v2= somecommandコマンドのコンテキストでv2=value somecommandset を使用してコマンドを実行するのと同じです。v2ある行を使用してコマンド置換を拡張し、それをHello\nThere最初の唯一の単語にトークン化してグローブしてから、コマンドで実行しようとします(v2環境は空の文字列に設定されています)。

パスに何もないので失敗しますHello\nThere。したがって、エラーメッセージが表示されますHello\nThere: No such file or directory

シェル変数の割り当てにはスペースを使用できず、を使用する必要があります。また、使用したいv2=$(...)変数の拡張と引数の周りに引用符を入れて、キャリッジリターンも削除する必要があります。\ntr\r

たとえば、Bashを使用すると、「Hellothere」が印刷されます。

#/bin/bash
v1=$'Hello\nthere'
v2=$(echo "$v1" | tr -d '\n\r')
printf "%s\n" "$v2"

以下が利用可能な場合は、拡張機能を$''使用して${var/pattern/replacement}改行とキャリッジリターンを削除することもできます。

#/bin/bash
v1=$'Hello\r\nthere\r\n'
v2=${v1//[$'\n\r']}
printf "%s\n" "$v2"

(二重スラッシュはすべての一致を置き換えます。代替部分がない場合は一致が削除されます。角括弧はパターン[]一致の意味を維持したいので、括弧を引用してはいけませんが、内部項目は考慮する必要があり\n\rます。$''バックスラッシュと文字のみまた、NLとCRも可能です。

望むより:

おすすめ記事