文字列に改行文字があることを確認している場合は、それを削除する方法

文字列に改行文字があることを確認している場合は、それを削除する方法

私が制御できないいくつかの操作の結果である文字列があります。を使用してこの変数を印刷すると、次のecho結果が得られます。

echo $myvar
hello

しかし、私がするとき

if [ $myvar = "hello" ]; then
    echo they are equal
else
    echo they are not equal
fi

私はいつも彼らが等しくないと感じます。性格のせいだと思いますnewline

文字列も奇妙に動作します。私がするとき:

newVAR="this is my var twice: "$myvar$myvar
echo $newVAR

私は得る:

hellois my var twice: hello

これが実際にaとによるものかどうかを確認するにはどうすればよいですかnewline?では、削除する必要がありますか?

答え1

問題は、キャリッジリターン(CR、\r)が含まれていることです。これにより、端末テキスト挿入ポイントが印刷中の行の先頭に戻ります。これが、例の行の先頭に「hello」が表示される理由です。$newVARこれはsed -n l、印刷できない文字(および行末)を表示する読み取り可能なビューです。

var=ab$'\r'c ; echo "$var";  printf %s "$var" | sed -n l
# output:
cb
ab\rc$

単純なbash条件付きチェックでテストできます。

[[ $var == *$'\r'* ]] && echo yes || echo no
# output:
yes

\r以下を使用してテストを実行および削除して、テストと修正を単一のステップにまとめることができます。

fix="${var//$'\r'/}"; echo "$var"; echo "$fix"
# output:
cb
abc

これ固定する使用シェルパラメータ拡張。上記で使用した特定の形式は、指定したパターンに基づいて部分文字列を置き換えるために使用されます。${parameter/pattern/string}<-- これは最初に見つかったものだけを置き換えます。模様そしてひも*parameterという変数にあります。変えるみんなモードでは、最初の項目///

答え2

Bash\rでは、次のように話すことができます。$'\r'

if [ "$myvar" = "hello"$'\r' ]; then
    echo they are equal
else
    echo they are not equal
fi

または\r最後の部分を切り取りますmyvar

if [ "${myvar%$'\r'*}" = "hello" ]; then
    echo they are equal
else
    echo they are not equal
fi

答え3

奇妙なことに、多くの殻にはgetoptsそのような職業の候補者がいるようです。一見すると直観に反しているように見えるかもしれませんが、getopts主な機能が一連の同じリンクオプションで見つけることができるだけ指定された単一文字のコマンドラインオプションを識別して解釈を提供すると考えると、次のような結果が出ることがあります。もう少し意味があります。

bashシェルでデモンストレーションするには:

x=$(printf '\n\r%010s\t' hello)
OPTIND=1
while  getopts : na "-$x"
do     printf %q\\n "$OPTARG"
done

$'\n'
$'\r'
\
\
\
\
\
h
e
l
l
o
$'\t'

このように、このgetoptsような状況では、分解を一種のシェル自動操縦装置で処理することが時々便利である。これにより、不要なバイトを直接フィルタリングしたり、caseバイト1で文字列バックアップを[テストして構築したりできます。]

OPTIND=1 y=$(printf \\n\\r) z=
while  getopts : na "-$x"
do     case $OPTARG in ([!$y])
            z=$z$OPTARG
       esac
done
printf %q\\n "$z"

$'     hello\t'

この簡単な例とすでに他の場所で述べたように、パラメータ拡張をサポートするシェルがある場合、拡張はおそらくここでうまく機能します。しかしgetopts、これに関して何をしているのかわからない場合は、言及する価値があると思いました。もちろん、それについて学びながら、私はそれのための便利なアプリケーションをたくさん見つけました。

答え4

Bashや他のシェル言語は便利ですが、時にはPerlのような実際のスクリプト言語を使う方が良いでしょう。 Perlは、UNIXコマンドだけでなく、他の言語(sedやawkなど)を呼び出すシェルスクリプトを非常に簡単に置き換えることができます。私は、20年前にsed、awk、およびFORTRANコードと呼ばれるさまざまなUNIXコマンドを呼び出すC-Shellスクリプトを作成し、これを学びました。 Perlでは、次のようにします。

chomp($myvar);   # removes the newline char

if("$myvar" eq "hello")   # string comparison
  {
  print "they are equal\n";
  }
else
  {
  print "they are not equal\n";
  }

関連情報