web-dev-qa-db-ja.com

「sed」を使用してファイルの最後に追加する

現在、sedを使用して、stdinからApache構成ファイルに書き込みます。このスクリプトでsedを使用して、bashスクリプトの制限を回避しています。この場合、呼び出し元のユーザーはファイルに書き込む権限を持っていないため、単にecho "..." >> outputfile.conf

これが私がwritingに対してファイルに持っているものです:

echo "<VirtualHost *:80>
    ...
</VirtualHost>" | Sudo sed -n "w/etc/Apache2/sites-available/000-default.conf"

どうすればこの同じファイルにappendできますか?

if $enable_ssl; then
    echo "<VirtualHost *:443>
        ...
    </VirtualHost>" | Sudo sed <opions-to-sed-here>
fi
5
Maverik Minett

より高い/異なる特権を持つShell >の通常の置き換えは次のとおりです。

echo "replace file content with this line" | Sudo tee protectedFile >/dev/null

追加する場合は、-aを使用します。

echo "append this line to file" | Sudo tee -a protectedFile >/dev/null
7
Isaac

echoなし:

string=$'"<VirtualHost *:443> \
        ... \
    </VirtualHost>"'

Sudo sed -i '$a\'"${string}"'' file

-iオプションは、sedにファイルをインプレースで処理するように指示します(オプションで、元のバージョンにサフィックスを追加します)。

Sedスクリプト:

  1. $最終行に一致
  2. a\一致する行の後にテキストを追加します

ただし、空のファイルでは機能しません(最後の行と一致する入力行がないため)。

5

完全を期すために、手元にedがある場合:

echo "$
a
<VirtualHost *:80>
...
</VirtualHost>
.
w" | Sudo ed protectedFile
  1. $最後の行に移動
  2. a append、その後に単一のドットを含む行で終了する追加したいデータ
  3. wwrite(file)の略です

最初の2つのコマンドは連結できます($a)、まだこれは空のファイルでは機能しません-「最後の行に移動する」(これはnoであるため) -op)、 "append"ではなく "append to last line"、これは実際には存在しません。

2
peterph