Reputation: 710
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/
Upvotes: 0
Views: 143
Reputation: 290415
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
$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
.
$ 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 -
Upvotes: 3
Reputation: 7845
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
Upvotes: 1