ファイルの最後の行末に一重引用符を追加する方法

ファイルの最後の行末に一重引用符を追加する方法

私は'、ファイルの最後に表示される(エスケープされていない文字)行に一重引用符を追加し、それをファイルに保存することができるPerl以外のソリューションが必要です。

猫の例.txt

var1: 'funn'
var2: 'weee'
var3: 'youuuu

   

期待される出力

猫の例.txt

var1: 'funn'
var2: 'weee'
var3: 'youuuu'

最後の行を印刷する方法awkと各行の末尾に文字を追加する方法を知っていますが、最後の行に一重引用符を追加してファイルを更新するだけではファイルを更新できません。

答え1

このsed式は、$s/$/'/入力の最後の行の末尾に一重引用符を追加します。最初は$最後の行の「アドレス」です。s最後の行が見つかると、指定された代替コマンドがトリガーされます。このコマンドは、$正規表現で一致する行末を一重引用符で置き換えます。

行の末尾に一重引用符がない場合にのみ置換を実行しますか?それからを使用してください$s/[^']$/&'/。これにより、最後の行の最後の文字がそれ自体に変わり、その後に一重引用符が続きます。文字は一重引用符ではありません。もちろん、これを行うには、その行にすでに1つ以上の文字が必要です。

シェルではsed二重引用符内でこれらの式を使用できますが、シェルから2つのドル記号をエスケープする必要があります。

sed "\$s/\$/'/" file
sed "\$s/[^']\$/&'/" file

サポートしている場合は、ファイルを内部sed-i編集できます。

ファイルの空でない最後の行にのみ適用し、後続の空白のみの行を削除するには、まずファイルの末尾から空の行を削除します。 1つの方法は、次のパイプラインを使用することです。

tac file | sed '1,/[[:graph:]]/ { /[[:graph:]]/!d; }' | tac

これはGNUを使用してファイルの行を反転し、空でない最初の行の前のすべての行を削除してから(「空白ではない」はグラフィック文字があることを意味するので、代わりにtac使用できます)、行を置き換えます。[^[:space:]][[:graph:]]

パイプライン出力の最後の行を変更します。

tac file | sed '1,/[[:graph:]]/ { /[[:graph:]]/!d; }' | tac |
sed "\$s/\$/'/" >file.new

または、次の2つのsed呼び出しを組み合わせます。

tac file | sed "1,/[[:graph:]]/ { /[[:graph:]]/\!d; s/\$/'/; }" | tac >file.new

!一部のシェルは、エスケープしないと履歴の拡張を試みることができます。)

...その後、次のようにfile交換file.newしてくださいmv

関連情報