web-dev-qa-db-ja.com

改行なしでエコー付きのテキストを追加

echo "abc" >>file.txtのようにファイルにテキストを追加したい。

しかし、これは新しい行の後にabcを追加します

改行なしでechoを付けてファイルの最後にabcを追加するにはどうすればよいですか?

17
choijj

echo "abc" >>file.txtは、改行の後にabcを置きます。独自の行でabcになる場合は、abcの前の改行がfile.txtにすでに存在していたことを意味します。

テキストファイルが改行で終わるのはまったく正常であることに注意してください。 UNIXでは、行はnull以外の一連の文字または改行とそれに続く改行で構成されます。1 したがって、空でないテキストファイルはすべて改行文字で終わります。

ファイルの最後の行にテキストを追加する場合、>>を使用してこれを行うことはできません。これは常にファイルに追加されるため、常に最後の改行の後に書き込まれるためです。代わりに、既存のファイルを変更できるツールが必要です。たとえば、 sed を使用できます。

sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt

Sedコマンドでは、最初の$は「最後の行でのみ次のコマンドを実行する」を意味し、コマンドs/REGEX/REPLACEMENT/はREGEXをREPLACEMENTに置き換え、最後に正規表現$が一致しますラインの。

Linuxのsedコマンドには、この新しいファイルの作成と置換のシーケンスを自動化する組み込み機能があるため、これを短縮して

sed -i '$ s/$/abc/' file.txt

⁰ これはnullバイトで、ASCIIはNULを呼び出し、UnicodeはU + 0000を呼び出します。テキスト処理プログラムはこの文字に対応する場合と対応しない場合があります。
1Text FileLine、およびNewline Characterの定義を参照してください。 IEEE 1003.1-2008:2016のBase Definitionsの章の「Definitions」セクション。

ファイルがまだ改行で終わっておらず、テキストを追加せずに単にテキストを追加したい場合、_-n_引数を使用できます。

_echo -n "some text here" >> file.txt
_

ただし、一部のUNIXシステムはこのオプションを提供していません。その場合は、printfを使用できます。

_printf %s "some text here" >> file.txt
_

(最初の_%s_引数は、_%_フォーマット文字が含まれる追加のテキストを防ぐためのものです)

_man echo_から(macOS High Sierraの場合):

-n

末尾の改行文字を印刷しません。これは、iBCS2互換システムで行われているように、_'\c'_を文字列の最後に追加することでも実現できます。このオプションと_'\c'_の効果は、Corによって修正されたIEEE Std 1003.1-2001( "POSIX.1")で実装定義されていることに注意してください。 1-2002。最大の移植性を目的とするアプリケーションでは、改行文字を抑制するためにprintf(1)を使用することを強くお勧めします。

16
fluffy

echoコマンドでは可能ではないと思います。代わりに次のsedアプローチを使用してください:

sed -i '$ s/$/abc/' file.txt
  • -i-ファイルを変更inplace
  • $-最後のレコード/行を示します
  • s/$/abc/-行末を置換$ with substring abc(for the last record)
15
RomanPerekhrest

truncateコマンドがあり、テキストファイルの最後の文字がNLである場合、それを削除して、次のようにテキストを追加できます。

truncate --size -1 file.txt
echo "abc" >>file.txt

truncateはファイルの内容については何も気にしないことに注意してください。この例では、ファイルサイズを1バイト減らします。最後の文字が1バイトではない場合、つまり、マルチバイトの「ワイド」文字の場合、腐敗が発生します。)

9
roaima

あなたが望むのは、それを最後の行の終わり、つまりその最後の行の区切り文字の直前、つまりファイルの最後の文字の直前に追加することです。

_ksh93_を使用すると、次のことができます。

_echo abc 1<> file >#((EOF - 1))
_

ここで、_1<>_は、標準出力でファイルを読み取り+書き込みモードで開くための標準的な演算子です(さらに重要なのは切り捨てなし)、>#((...))はksh93固有です- seeking演算子(ここでは、最後のバイトの前にシークします)。 echoは_abc<newline>_を書き込み、aはそこにあった改行を上書きし、echoは独自の改行を追加することに注意してください。

zshに相当するもの:

_zmodload zsh/system
{sysseek -w end -u 1 -1 && echo abc} 1<> file
_

より正確な同等物のために、シークに失敗したときにエラーメッセージを出力する必要もあります:

_zmodload zsh/system
if sysseek -w end -u 1 -1; then
  echo abc
else
  syserror -p "$0: $LINENO: seek: "
fi 1<> file
_
5