Suppose a file /etc/fstab
contains the following:
/dev/xvda1 / ext4 defaults 1 1
/dev/md0 /mnt/ibsraid xfs defaults,noatime 0 2
/mnt/ibsr
After some digging, I found that it is possible to escape the /
in the pattern string using \
. So this works:
$ sed '/^\/dev\/xvdb/d' /etc/fstab
You were very close. When you use a nonstandard character for a pattern delimiter, such as |pattern|
, the first use of that character must be escaped:
$ sed '\|^/dev/xvdb|d' /etc/fstab
/dev/xvda1 / ext4 defaults 1 1
/dev/md0 /mnt/ibsraid xfs defaults,noatime 0 2
/mnt/ibsraid/varlog /var/log none bind 0 0
Similarly, one can use:
sed '\?^/dev/xvdb?d' /etc/fstab
Lastly, it is possible to use slashes inside of /pattern/
if they are escaped in the way that you showed in your answer.
Why the obsession with using forward slash as your delimiter? Just use something else, like a comma:
sed ',^/dev/xvdb,d' /etc/fstab
or a colon:
sed ':^/dev/xvdb:d' /etc/fstab
Or whatever makes it easiest to read. The delimiter can be any character. The convention is to use a forward slash, but when it becomes awkward, switch it to something else.
Note, if you want to change the file itself, rather than output the result, you need the "in place" flag -i
:
sed -i ':^/dev/xvdb:d' /etc/fstab