時々、シェルスクリプトを気にせずに書いている間、最も簡単なことにも数時間かかることがあります。
Content='me \n you \n him \n'
echo $Content > Names.txt
開くNames.txt
と、最後に2つの空行があります。
空の行が1つしかありません。このContent
変数はループで評価され、反復ごとに新しい行が追加されます。だから私は変更できませんContent
。
echo -n
新しい行をすべて削除するため使用できません。
\n
この場合、すべての行が互いに接続されているため、ループから削除することはできません。
Content=$(echo $Content | awk 'NR>1{print PREV} {PREV=$0} END{printf("%s",$0)}')
末尾の改行を削除してみましたが、うまくawk
いきません。このサイトの回答から取得しました。
printf %s $Content > File.txt
代わりに試してみましたが、echo -e
まだ成功していません。
与えられた文字列変数から末尾の改行を削除したり、ファイルにそのまま書き込んだり、Linuxに他の行を追加したりしないように指示するにはどうすればよいですか?
答え1
これは2番目の改行を追加するLinuxではありません。呼び出すとbashですecho
!
したがって、答えはシェルの組み込み関数のドキュメントにありますman builtins
。
echo [-neE] [arg ...] Output the args, separated by spaces, followed by a newline. The return status is 0 unless a write error occurs. If -n is specified, the trailing newline is suppressed.
これでecho -n
トリックが完了しました。実際には、echo -ne
それ以外-e
の場合はファイルにリテラル文字列が含まれるため、使用する必要があります。
me \n you \n him \n
(その中に「バックスラッシュn」があります!!)
echo -n はすべての新しい行を削除するので使用できません。
いいえ、そうではありません。
編集:次のコマンドダイアログボックスとその出力は、実行時に上記のbash
説明を確認します。
$ Content='me \n you \n him \n'
$ echo $Content > Names.txt
$ cat Names.txt
me \n you \n him \n
$ echo -e "$Content" > Names.txt
$ cat Names.txt
me
you
him
$ echo -en "$Content" > Names.txt
$ cat Names.txt
me
you
him
$
答え2
使用printf
形式%b
:
%b ARGUMENTは ''エスケープとして解釈されますが、8進エスケープは\ 0または\ 0 NNNとして解釈される文字列です。
$ Content='me \n you \n him \n'
$ printf "%b" "$Content" > Names.txt
$ cat Names.txt
me
you
him
答え3
echoの代わりにprintfを引用して使用するのが最善です。
まず、あなたの説明が一致しません。 with 変数がある場合 with 、 nor 、 with or'me \n you \n him \n'
以外のどこにも改行文字はありません。echo $var
printf '%s' $var
echo "$var"
printf '%s' "$var"
$ var='me \n you \n him \n'
$ echo $var
me \n you \n him \n
改行文字もなく、終了改行文字もありません(エコーによって追加されたものを除く)。
私はあなたが持っているものが改行文字を持っていると信じています\n
。それは次のとおりです。
$ var=$'me \n you \n him \n'
$ printf '%s' "$var"
me
you
him
$
ここで引用は(非常に)重要です。
$ printf '%s' $var
meyouhim$
.........
$ echo $var
meyouhim
$
.........
$ echo "$var"
me
you
him
$
.....
echoによって追加された改行文字が表示されることを確認してください。削除された唯一の項目は次のとおりですecho -n
。
$ echo -n "$var"
me
you
him
$
これはファイルに問題があるようです。 2つの改行文字(実際の$Content
varでは1、echoでは1)で終わります。
それが本当に問題であれば、aはecho -n "$var" > Names.txt
末尾の改行文字が1つしかないファイルを提供します。
または、次のようにすることをお勧めします。
$ Content=$'me \n you \n him \n'
$ printf '%s' "$Content" > Names.txt
$ cat Names.txt
me
you
him
$