特定の文字列を変数(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 somecommand
set を使用してコマンドを実行するのと同じです。v2
ある行を使用してコマンド置換を拡張し、それをHello\nThere
最初の唯一の単語にトークン化してグローブしてから、コマンドで実行しようとします(v2
環境は空の文字列に設定されています)。
パスに何もないので失敗しますHello\nThere
。したがって、エラーメッセージが表示されますHello\nThere: No such file or directory
。
シェル変数の割り当てにはスペースを使用できず、を使用する必要があります。また、使用したいv2=$(...)
変数の拡張と引数の周りに引用符を入れて、キャリッジリターンも削除する必要があります。\n
tr
\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も可能です。
望むより: