Sed script that will find a match in a line, and the change another part of that line

StackOverflow https://stackoverflow.com/questions/19338546

  •  30-06-2022
  •  | 
  •  

Pergunta

I'm trying to change the "FS" type of the lines containing c1t1 from ufs to ext2 and change c1t1 to c1t2 everywhere on those lines. This is what the file looks like:

#device     device      mount       FS  fsck    mount   mount
#to mount   to fsck     point       type    pass    at boot options
#

#/dev/dsk/c1d0s2 /dev/rdsk/c1d0s2 /usr      ufs 1   yes -

fd  -   /dev/fd fd  -   no  -
/proc   -   /proc   proc    -   no  -
/dev/dsk/c0t0d0s1   -   -   swap    -   no  -
/dev/dsk/c0t0d0s0   /dev/rdsk/c0t0d0s0  /   ufs 1   no  -
/dev/dsk/c0t0d0s6   /dev/rdsk/c0t0d0s6  /usr    ufs 1   no  -
/dev/dsk/c0t0d0s4   /dev/rdsk/c0t0d0s4  /var    ufs 1   no  -
/dev/dsk/c0t0d0s5   /dev/rdsk/c0t0d0s5  /local  ufs 2   yes -
/dev/dsk/c0t0d0s3   /dev/rdsk/c0t0d0s3  /usr/openwin    ufs 2   yes -

/dev/dsk/c1t0d0s0   /dev/rdsk/c1t0d0s0  /opt    ufs 3   yes -
/dev/dsk/c1t0d0s3   /dev/rdsk/c1t0d0s3  /export/user1   ufs 3   yes nosuid
/dev/dsk/c1t1d0s0   /dev/rdsk/c1t1d0s0  /usr/local  ufs 3   yes -

/dev/dsk/c1t1d0s3   /dev/rdsk/c1t1d0s3  /export/user3   ufs 3   yes nosuid  
/dev/dsk/c2t0d0s0   /dev/rdsk/c2t0d0s0  /export/home    ufs 4   yes nosuid  
/dev/dsk/c2t0d0s3   /dev/rdsk/c2t0d0s3  /casa6  ufs 4   yes -
/dev/dsk/c2t3d0s0   /dev/rdsk/c2t3d0s0  /export/user2   ufs 5   yes nosuid  
/dev/dsk/c2t3d0s3   /dev/rdsk/c2t3d0s3  /stage  ufs 5   yes -

# ringer.cs.utsa.edu:/usr/local/news    -   /usr/local/news nfs -   yes retry=10    
ringer.cs.utsa.edu:/var/mail    -   /var/mail   nfs -   yes retry=10,actimeo=0  
#ringer.cs.utsa.edu:/var/spool/news -   /var/spool/news nfs -   yes retry=10
#ringer.cs.utsa.edu:/answerbook -   /answerbook nfs -   yes retry=10

swap    -   /tmp    tmpfs   -   yes -

This is all I've been able to figure out:

s/(^\/dev\/dsk\/c1t1.*)ufs(.*$)/$1ext2$2/
Foi útil?

Solução 2

Looks like your search might benefit from a capture-and-replace:

sed -e 's/^\(.*dsk\/\)c1t1\(.*\)ufs\(.*\)$/\1c1t2\2ext2\3/g' some_file

It's not that readable and there are other ways to do it, but \( \) captures something. In the above example, I've captured three things, and when I want to dump them back in I refer to them in the following way (in the order of capture):

\1 \2 \3

Outras dicas

When the syntax is a bit confusing, sometimes it is time to use awk:

awk '$1~/c1t1/ {$4="ext2"; sub("c1t1","c1t2",$0)}1' file

Explanation

  • $1~/c1t1/ checks if the first field contains c1t1. If so, performs {}.
  • $4="ext2" sets 4th field to "ext2".
  • sub("c1t1","c1t2",$0) replaces all c1t1 with c1t2 throughout the line ($0).
  • 1 prints all the lines.

You can execute it and redirect to another file: awk ... file > new_file.

Test

$ awk '$1~/c1t1/ {$4="ext2"; sub("c1t1","c1t2",$0)}1' file

#device     device      mount       FS  fsck    mount   mount
#to mount   to fsck     point       type    pass    at boot options
#

#/dev/dsk/c1d0s2 /dev/rdsk/c1d0s2 /usr      ufs 1   yes -

fd  -   /dev/fd fd  -   no  -
/proc   -   /proc   proc    -   no  -
/dev/dsk/c0t0d0s1   -   -   swap    -   no  -
/dev/dsk/c0t0d0s0   /dev/rdsk/c0t0d0s0  /   ufs 1   no  -
/dev/dsk/c0t0d0s6   /dev/rdsk/c0t0d0s6  /usr    ufs 1   no  -
/dev/dsk/c0t0d0s4   /dev/rdsk/c0t0d0s4  /var    ufs 1   no  -
/dev/dsk/c0t0d0s5   /dev/rdsk/c0t0d0s5  /local  ufs 2   yes -
/dev/dsk/c0t0d0s3   /dev/rdsk/c0t0d0s3  /usr/openwin    ufs 2   yes -

/dev/dsk/c1t0d0s0   /dev/rdsk/c1t0d0s0  /opt    ufs 3   yes -
/dev/dsk/c1t0d0s3   /dev/rdsk/c1t0d0s3  /export/user1   ufs 3   yes nosuid
/dev/dsk/c1t2d0s0 /dev/rdsk/c1t1d0s0 /usr/local ext2 3 yes -

/dev/dsk/c1t2d0s3 /dev/rdsk/c1t1d0s3 /export/user3 ext2 3 yes nosuid
/dev/dsk/c2t0d0s0   /dev/rdsk/c2t0d0s0  /export/home    ufs 4   yes nosuid  
/dev/dsk/c2t0d0s3   /dev/rdsk/c2t0d0s3  /casa6  ufs 4   yes -
/dev/dsk/c2t3d0s0   /dev/rdsk/c2t3d0s0  /export/user2   ufs 5   yes nosuid  
/dev/dsk/c2t3d0s3   /dev/rdsk/c2t3d0s3  /stage  ufs 5   yes -

# ringer.cs.utsa.edu:/usr/local/news    -   /usr/local/news nfs -   yes retry=10    
ringer.cs.utsa.edu:/var/mail    -   /var/mail   nfs -   yes retry=10,actimeo=0  
#ringer.cs.utsa.edu:/var/spool/news -   /var/spool/news nfs -   yes retry=10
#ringer.cs.utsa.edu:/answerbook -   /answerbook nfs -   yes retry=10

swap    -   /tmp    tmpfs   -   yes -
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top