ファイルの文字列に改行または追加

ファイルの文字列に改行または追加

ファイルから文字列の一部を検索し、行全体を置き換えるか、文字列が見つからない場合は、ファイルに文字列を追加する方法について提案を探しています。私はしばらくsedを「プレイ」してきましたが、期待通りに動作させることはできません。

以下を追加する必要があります。

/swapfile   none    swap    sw    0   0

/etc/fstabUbuntu 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

答え2

これを自動化するためにPuppetを使用しているので、Puppetにfstabそれを処理させるのが最善です。使用マウントリソースタイプ

それは次のとおりです。

mount{'swapfile':
    name    => 'none',
    fstype  => 'swap',
    ensure  => mounted,
    atboot  => true,
    device  => '/swapfile',
    options => 'sw',
}

動作する必要があります。

もしこれが必ず一行でなされなければならない(記録のため、私はまだ反対する)、次がperl役に立ちます:

perl -pi -e 'BEGIN{$string = "/swapfile   none    swap    sw    0   0"} s!^/swapfile.*!$string! && $x++;END{print "$string\n" unless $x}' /etc/fstab

明確にするために、次のように行に分けました。

perl -pi -e '
             BEGIN{$string = "/swapfile   none    swap    sw    0   0"}
             s!^/swapfile.*!$string! && $x++; # Modify line if it exists
             END{print "$string\n" unless $x} # Append it if it wasn't found
            ' /etc/fstab

関連情報