私は'
、ファイルの最後に表示される(エスケープされていない文字)行に一重引用符を追加し、それをファイルに保存することができる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
。