【问题标题】:Linux ed Editor multiple search/replaces in one lineLinux ed Editor 在一行中进行多个搜索/替换
【发布时间】:2017-06-10 18:32:22
【问题描述】:

我想用 Linux 中的 ed 编辑器在以下文件的一行中进行多次替换:

#device     device      mount       FS  fsck    mount   mount
#to mount   to fsck     point       type    pass    at boot options
#
#/dev/dsk/c0d0s2 /dev/rdsk/c0d0s2 /usr      ufs 1   yes -
fd  -   /dev/fd fd  -   no  -
/proc   -   /proc   proc    -   no  -
/dev/dsk/c0d0s3 -   -   swap    -   no  -
/dev/dsk/c0d0s0 /dev/rdsk/c0d0s0    /   ufs 1   no  -
/dev/dsk/c0d0s4 /dev/rdsk/c0d0s4    /usr    ufs 1   no  -
/dev/dsk/c0d0s1 /dev/rdsk/c0d0s1    /var    ufs 1   yes -
/dev/dsk/c0d0s7 /dev/rdsk/c0d0s7    /export ufs 2   yes -
/dev/dsk/c0d0s5 /dev/rdsk/c0d0s5    /usr/informix   ufs 2   yes -
swap    -   /tmp    tmpfs   -   yes -

我想将 /dev/ 中的所有 "c0""c1" 交换....

这是我放入 ed:1,\$s/\(\/dev.*\)\(c0\)\(d0s.*\)/\1c1\3/g 的正则表达式,结果是

   #device      device      mount       FS  fsck    mount   mount
    #to mount   to fsck     point       type    pass    at boot options
    #
    #/dev/dsk/c0d0s2 /dev/rdsk/c1d0s2 /usr      ufs 1   yes -
    fd  -   /dev/fd fd  -   no  -
    /proc   -   /proc   proc    -   no  -
    /dev/dsk/c1d0s3 -   -   swap    -   no  -
    /dev/dsk/c0d0s0 /dev/rdsk/c1d0s0    /   ufs 1   no  -
    /dev/dsk/c0d0s4 /dev/rdsk/c1d0s4    /usr    ufs 1   no  -
    /dev/dsk/c0d0s1 /dev/rdsk/c1d0s1    /var    ufs 1   yes -
    /dev/dsk/c0d0s7 /dev/rdsk/c1d0s7    /export ufs 2   yes -
    /dev/dsk/c0d0s5 /dev/rdsk/c1d0s5    /usr/informix   ufs 2   yes -
    swap    -   /tmp    tmpfs   -   yes -  

但是,这个长正则表达式:
1,\$s/\(\/dev.*\)\(c0\)\(d0s.*\)\(\/dev.*\)\(c0\)\(d0s.*\)/\1c1\3\4c1\6/g 会导致:

#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/c0d0s3 -   -   swap    -   no  -
/dev/dsk/c1d0s0 /dev/rdsk/c1d0s0    /   ufs 1   no  -
/dev/dsk/c1d0s4 /dev/rdsk/c1d0s4    /usr    ufs 1   no  -
/dev/dsk/c1d0s1 /dev/rdsk/c1d0s1    /var    ufs 1   yes -
/dev/dsk/c1d0s7 /dev/rdsk/c1d0s7    /export ufs 2   yes -
/dev/dsk/c1d0s5 /dev/rdsk/c1d0s5    /usr/informix   ufs 2   yes -
swap    -   /tmp    tmpfs   -   yes -

将第一个“c0”保留为“c0”,因为搜索字符串没有找到它


所以我得到了一个文件,其中一行中有多个搜索结果,但它只替换了一个实例。我知道“全局”标志在文件的第一步运行并标记匹配的。我希望我知道导致问题的原因,但我没有足够的 ed 经验知道如何解决它。
为你的帮助干杯

【问题讨论】:

  • 请向example 提供数据、结果和预期结果。

标签: regex search replace editor ed


【解决方案1】:

您可以使用g 命令搜索带有dev 字符串的行,然后使用s(替代)命令和g(全局)标志进行全局替换:

g/\/dev/s/c0/c1/g

给你预期的结果:

#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/c1d0s3 -   -   swap    -   no  -
/dev/dsk/c1d0s0 /dev/rdsk/c1d0s0    /   ufs 1   no  -
/dev/dsk/c1d0s4 /dev/rdsk/c1d0s4    /usr    ufs 1   no  -
/dev/dsk/c1d0s1 /dev/rdsk/c1d0s1    /var    ufs 1   yes -
/dev/dsk/c1d0s7 /dev/rdsk/c1d0s7    /export ufs 2   yes -
/dev/dsk/c1d0s5 /dev/rdsk/c1d0s5    /usr/informix   ufs 2   yes -
swap    -   /tmp    tmpfs   -   yes -

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多