たとえば、ファイルにテキストを追加したいと思います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>
上書きし、独自の改行を追加することに注意してください。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