次のサンプルファイルでは、単語を含む行を除いて、で始まるすべてのfstab
行を削除しようとしていますUUID
。UUID
boot
/dev/mapper/VG100-lv_root / xfs defaults 0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot xfs defaults 0 0
/dev/mapper/VG100-lv_var /var xfs defaults 0 0
UUID=0b14011d-f69d-4c4c-8ce0-6240bb0a574a /var/kafka/mp1 xfs defaults,noatime 0 0
UUID=2d7872f2-96d4-4ba9-8a17-a1115542645c /var/kafka/mp2 xfs defaults,noatime 0 0
UUID=79bdbf56-9a09-4505-ab8e-41ce9432cf0f /var/kafka/mp3 xfs defaults,noatime 0 0
UUID=ca42a388-83d4-4f8b-aff7-3450d836eef7 /var/kafka/mp4 xfs defaults,noatime 0 0
UUID=62d356bb-c393-4a74-bbf9-984b60d3b5c4 /var/kafka/mp5 xfs defaults,noatime 0 0
UUID=d4071a83-204f-475f-8917-cdd77ef6b1ed /var/kafka/mp6 xfs defaults,noatime 0 0
したがって、例外の結果は次のようになります。
/dev/mapper/VG100-lv_root / xfs defaults 0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot xfs defaults 0 0
/dev/mapper/VG100-lv_var /var xfs defaults 0 0
これまでのところ、私たちは次のsedを持っています
sed -i '/^UUID/d' /etc/fstab
UUID
しかし、上記の方法はすべての行を削除します
答え1
UUID=
最初のフィールドがで始まり、2番目のフィールドがそうでない行を削除したいようです/boot
。
したがって、awk
Perlのawkモードは確実な選択のように見えます。
awk '! ($1 ~ /^UUID=/ && $2 != "/boot")' /etc/fstab
(GNU awkは内部編集に使用できます-i /usr/share/awk/inplace.awk
)。
perl -lae 'print unless $F[0] =~ /^UUID=/ && $F[1] ne "/boot"' /etc/fstab
(内部編集perl
用)。-i
以下を使用して同じことを実行できますsed
。
sed '/^[[:space:]]*[^[:space:]]\{1,\}[[:space:]]\{1,\}/boot\([[:space:]].*\)\{0,1\}$/b
/^[[:space:]]*UUID=/d' /etc/fstab
一部は(most)または(Macosを含むFreeBSDとその派生)を使用してsed
その場所で編集できます。-i
-i ''
^使用しないでください-i inplace
現在の作業ディレクトリから最初に拡張機能をgawk
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
答え2
まず、sedに埋め込み行を印刷するように指示し、区切り文字式を使用して埋め込みboot
行を削除するように指示します。UUID
;
sed -i '/boot/p;/UUID/d' /etc/fstab
印刷式が削除式の前に与えられるため、bootを含む行は、UUIDを持つ行が削除される前に印刷されます。これは、式の位置を変更したい場合は機能しません。
与えた例を考えると、次のようなものを得る必要があります
/dev/mapper/VG100-lv_root / xfs defaults 0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot xfs defaults 0 0
/dev/mapper/VG100-lv_var /var xfs defaults 0 0
^
空白行を削除し、行の先頭を表示し、行の終わりを示すセクションを追加することも$
できます。$
^
sed -i '/boot/p;/UUID/d;/^$/d' /etc/fstab
編集する
Stéphane Chazelasがコメントで指摘したように、UUIDが同じ行に含まれていない場合は、bootを含む行が2回印刷されるため、このような方が良いでしょう。
sed -i '/^UUID/{/boot/!d};/^$/d' /etc/fstab
/bootが含まれていない場合は、UUIDで始まる行を削除してから空の行を削除します。
答え3
多くの可能性があります。簡単にするには、次のものを使用できます。
'/^UUID/{
/\/boot/b
d
}'
{}
パターンが一致したときに実行する追加のコマンドを含めるために使用されます。起動が一致した場合はb
コマンドの最後に分岐し、それ以外の場合は完了しますd
。または、
'/^UUID/{
/\/boot/!d
}'
始動がかかった場合いいえ一致して削除します。これらのパターンはスペースマッチングで改善する必要がありますが、ファイル内の期待される内容を理解している場合はおそらく気にしません。
1行バージョンは一部のバージョンでは機能しない場合がありますsed
。
'/^UUID/{/\/boot/b;d;}'
そして
'/^UUID/{/\/boot/!d;}'
答え4
そして真珠:
perl -i -pe 's@^UUID\S+\s++(?!/boot).*\n@@' /etc/fstab
似-i
ているsed
、待ち行列
正規表現の一致は次のとおりです。
節 | 説明する |
---|---|
^ |
文字列の始まり |
UUID |
「UUID」 |
\S+ |
空白以外の文字(\n、\r、\t、\f、および" "を除くすべての文字)(1回以上(最大一致)) |
\s++ |
スペース(\n、\r、\t、\f、および "")は1回以上一致し、何も返しません。 |
(?! |
視野以下があることを確認してください。 |
/boot |
「/スタート」 |
) |
プレビュー終了 |
.* |
\nを除くすべての文字(0回以上(最大一致)) |
\n |
'\n' (改行文字) |