改行なしでエコでテキストを追加する

改行なしでエコでテキストを追加する

たとえば、ファイルにテキストを追加したいと思いますecho "abc" >>file.txt

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

abcラップせずにファイルの末尾にエコーを追加する方法は?

答え1

ファイルがまだ改行文字で終わらず、テキストを追加せずに一部のテキストのみを追加したい場合は、このパラメーターを-n使用できます。

echo -n "some text here" >> file.txt

ただし、一部のUNIXシステムではこのオプションを提供していませんprintf

printf %s "some text here" >> file.txt

(元の引数は、書式指定文字が%s追加されたテキスト%に含まれないようにすることでした)

(macOS High Sierraからman echo):

-N

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

答え2

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コマンドでは、first$は「最後の行でのみ次のコマンドを実行します」という意味でs/REGEX/REPLACEMENT/REGEXをREPLACMENTに置き換え、正規表現は行$の終わりと一致します。

Linuxのsedコマンドには、新しいファイルの作成と置換の順序を自動化する機能が組み込まれているため、次のように短縮できます。

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

⁰これはASCIIではNUL、UnicodeではU+0000というヌルバイトです。テキスト処理プログラムはこの文字を処理することも、処理しないこともあります。
1 定義を見るテキストファイルワイヤー改行文字「定義」セクションで基本定義IEEE 1003.1-2008:2016章。

答え3

echo命令語ではいけないようですが、下記の命令語をご利用くださいsed反対のアプローチ:

sed -i '$ s/$/abc/' file.txt
  • -i- ファイルの修正所定の位置に
  • $- 最後のレコード/行を示します。
  • s/$/abc/$- 行末を部分文字列に置き換えるabc(最後のレコードの場合)

答え4

必要なのは、ファイルの最後の文字の前にある最後の行区切り文字の前、最後の行の末尾に追加することです。

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

echo abc 1<> file >#((EOF - 1))

1<>読み書きモードでファイルを開く標準演算子はどこにあります(もっと重要なのは)切り捨てなし) stdout にあり、>#((...))ksh93 専用です。救う演算子(ここで最後のバイトの前を探します)。echo書き込みはそこにある改行文字をabc<newline>上書きし、独自の改行を追加することに注意してください。aecho

同等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

関連情報