2016-09-02 4 views
0

すべての行で繰り返されるファイルから文字列を変更する必要がありますが、すべての行ではなく数行だけ変更する必要があります。どのように私は/家および/ varエントリの「文字列」に「デフォルト」の文字列を変更することができます正確なロール上の正確な単語をASCIIファイルで変更する

/dev/mapper/rhel-root   /      xfs  defaults  0 0 
/dev/mapper/rhel-boot   /boot     ext4 defaults  1 2 
/dev/mapper/rhel-home   /home     ext3 defaults  1 2 
/dev/mapper/rhel-var    /var     ext3 defaults  1 2 
/dev/mapper/workvg-swaplv  swap     swap defaults  0 0 

: は、/ etc/fstabファイルを言うことができますか? インクルードはgrepの組み合わせの多くを使用している私が試したと思い| exargsなどが、期待どおりに動作しません:)

echo $(egrep "/var | /home" fstab | awk '{ print $4}') | xargs -I '{}' sed 's/{}/string/' fstab 

ことができます誰かが私にこのに関するいくつかのアイデアを提供します| sedの? あらかじめありがとうございます!

答えて

2
$ sed -E '/\/(home|var)/ s/defaults/string/' fstab 
/dev/mapper/rhel-root   /      xfs  defaults  0 0 
/dev/mapper/rhel-boot   /boot     ext4 defaults  1 2 
/dev/mapper/rhel-home   /home     ext3 string  1 2 
/dev/mapper/rhel-var    /var     ext3 string  1 2 
/dev/mapper/workvg-swaplv  swap     swap defaults  0 0 
  • -E使用する拡張正規表現は、
  • /\/(home|var)/これは、置換文字列と/home又は/var
  • s/defaults/string/代替必要なパターンを持つ行だけを一致させることである

編集:

01より堅牢なマッチングのため

sed -E '/^\S+\s+\/(home|var)\b/ s/^((\S+\s+){3})defaults\b/\1string/' fstab 

これは、ワード境界に対する

\bチェック、空白\sマッチ、\Sを2列に/home又は/varの正確な一致をチェックし、第4列にdefaultsの完全一致を置き換え空白以外のマッチ

+0

ありがとう、完璧に動作します! –

+2

これは、投稿されたサンプル入力が与えられたときに期待される出力を生成しますが、他の入力で失敗する方法はたくさんあります。 rhel-bootがホームブートだった場合、または文字列に&が含まれている場合、またはmapperがデフォルトであった場合や....だから - それを使用する際は注意してください! –

0
  • /\/var || /\/homeレコード内のキーワードが
  • sub{/defaults/, "string")
  • 1印刷が変更「文字列」との最初の「デフォルト」と変わらず、レコード
+0

私と一緒にいて、私は電話クライアントをテストしています... –

+0

それは、ありがとうございます! –

1

これは、すべての入力行に対してとdefaultsのすべての値に対して頑健に動作するとを交換する場合(あなたがそれらを持っていない場合は簡単に微調整)バックスラッシュが含まれていないstring

$ cat tst.awk 
BEGIN { split(entries,t); for (i in t) tgts["/"t[i]] } 
($2 in tgts) && match($0,/^((\S+\s+){3})(\S+)(\s.*)$/,a) && (a[3]==old) { $0 = a[1] new a[4] } 
{ print } 

$ awk -v entries="home var" -v old="defaults" -v new="string" -f tst.awk file 
/dev/mapper/rhel-root   /      xfs  defaults  0 0 
/dev/mapper/rhel-boot   /boot     ext4 defaults  1 2 
/dev/mapper/rhel-home   /home     ext3 string  1 2 
/dev/mapper/rhel-var    /var     ext3 string  1 2 
/dev/mapper/workvg-swaplv  swap     swap defaults  0 0 

それは第三引数が一致するためのGNU AWK()、その他のawksを使用していますsubstr()を使用します。

0
awk '/home|var/{sub(/defaults/,"string ")}1' file 

/dev/mapper/rhel-root   /      xfs  defaults  0 0 
/dev/mapper/rhel-boot   /boot     ext4 defaults  1 2 
/dev/mapper/rhel-home   /home     ext3 string   1 2 
/dev/mapper/rhel-var    /var     ext3 string   1 2 
/dev/mapper/workvg-swaplv  swap     swap defaults  0 0 
関連する問題