文字列変数から末尾の改行文字を削除中に停止する

文字列変数から末尾の改行文字を削除中に停止する

時々、シェルスクリプトを気にせずに書いている間、最も簡単なことにも数時間かかることがあります。

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 $varprintf '%s' $varecho "$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つの改行文字(実際の$Contentvarでは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
$

関連情報