sed+ は行の先頭に文字列を追加しますが、すでに存在する場合は無視します。

sed+ は行の先頭に文字列を追加しますが、すでに存在する場合は無視します。

次の例は、fstab で UUID 番号を一致させるときに行の先頭に文字列を追加する方法を示しています。

sed -e "/UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/ s/^/###FAULTY_DISK###/"  -i /etc/fstab

我々は確認することができます

more /etc/fstab 

###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0

しかし、2回目の実行では、

sed -e "/UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/ s/^/###FAULTY_DISK###/"  -i /etc/fstab


more /etc/fstab
###FAULTY_DISK######FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0

###FAULTY_DISK###fstabファイルにすでに設定されている場合は、追加を無視するようにsedに指示する方法

答え1

そのUUIDで始まる場合にのみ追加します。

sed -e 's/^UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/###FAULTY_DISK###&/' /etc/fstab

または、先行スペースも無視したい場合(存在する場合):

sed -e 's/^[[:blank:]]*UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/###FAULTY_DISK###&/' /etc/fstab

答え2

もう一つの方法は、行をスキップすることです###FAULTY_DISK###。 1行に無効なディスクの説明が含まれており、他の行にはそうでない次のサンプルファイルを考えてみましょう。

$ cat fstab 
UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0
###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0

nin コマンドを使用して、sed次の行に移動できます。したがって、sedこの行がエラーメッセージと一致する場合は、次の行に移動するように求められます。

$ sed  "/###FAULTY_DISK###/n; s/UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/###FAULTY_DISK###&/" fstab 
###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0
###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0

ご覧のとおり、メッセージはメッセージのない行にのみ追加されます。

答え3

私が正しく理解した場合:

一方

##FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a
UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a

それから

$ sed '/^###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/!s/^UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/###FAULTY_DISK###&/' /etc/fstab 
###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a
###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a

答え4

使用幸せ(以前のPerl_6)

raku -pe 's/ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") /\#\#\#FAULTY_DISK\#\#\#$0/;' fstab_test.txt

または

raku -pe 's[ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") ] = "\#\#\#FAULTY_DISK\#\#\#$0";'

上記の答えは、Perlプログラミング言語スイートに属するRakuで書かれています。前に追加すると、同じ Raku 単一行の後続実行中に###FAULTY_DISK###ファイルの 1 行がfstab無視されます。つまり、修正は安定している。

サンプル入力とサンプル出力については、下記のリンクをご覧ください。

https://unix.stackexchange.com/a/689556/227738

関連情報