ファイルから文字列の一部を検索し、行全体を置き換えるか、文字列が見つからない場合は、ファイルに文字列を追加する方法について提案を探しています。私はしばらくsedを「プレイ」してきましたが、期待通りに動作させることはできません。
以下を追加する必要があります。
/swapfile none swap sw 0 0
/etc/fstab
(Ubuntu 14.04 - 信頼できるTal)。
状況:
/swapfile
次の行がある場合は、その行/etc/fstab
を削除して上記の文字列に置き換えます。- で始まる行が複数ある場合は、すべて
/swapfile
削除して上記の文字列をファイルの末尾に追加します。 /swapfile
になければ、文字列/etc/fstab
を次に追加します。/etc/fstab
- コマンドはコンソール出力を表示しないでください。「1行」でなければなりません(Puppetの自動化のため)。
私はこれが可能だと思いますが、必要な方法でsedを使用することに関するチュートリアルを見つけることができませんでした。
私は使用しましたが、sudo sed -i '$a/swapfile none swap sw 0 0' /etc/fstab
文字列だけを追加しました:(
ベストアンサー1
sedを使用してこれを実行できます。 Turing Completeです。ただし、これは作業に最適なツールではありません。 Sedには交換されたことを覚える便利な方法はありません。
sedで比較的簡単にできることは、で始まるすべての行を空にし、/swapfile
最後に新しい行を追加することです。
sed -i '$! s/^\/swapfile[\t ]//; $s/\(^\/swapfile.*\)\?$/\n\/swapfile none swap sw/' /etc/fstab
しかし、それに加えて、私たちはこのようなsedコードを他のシステム管理者に維持するために任せない領域に急速に入りました。特に、シンプルで読みやすいシェルコマンドの組み合わせは、はるかに優れた操作を行う場合にはさらにそうです。
{ </etc/fstab grep -v '/swapfile[\t ]'; echo '/swapfile none swap sw'; } >/etc/fstab.new && mv /etc/fstab.new /etc/fstab
/swapfile
行の既存の場所(存在する場合)を維持し、変更が必要な場合にのみファイルを変更するには、シェルロジックとawkの組み合わせがより良いツールです。ここでは明確にするために複数の行を使用していますが、必要に応じてすべてのコードを同じ行に配置できます。ボーナスとして、ファイルに既に予想される行(正確な間隔を含む)が含まれている場合は変更されません。
awk '
/\/swapfile[\t ]/ {if (replaced) {next}
else {replaced=1; print "/swapfile none swap sw"}}
1 {print}
END {if (!replaced) print "/swapfile none swap sw"}
' /etc/fstab >/etc/fstab.new &&
if cmp -s /etc/fstab.new /etc/fstab.new; then
rm /etc/fstab.new;
else
mv /etc/fstab.new /etc/fstab;
fi