sed通配符表现不如预期

时间:2017-11-24 00:34:49

标签: sed replace wildcard

尝试用“显微照片”替换“/ data / kollman / appion / * / relion / micrographs”

sed -i 's/\/data\/kollman\/appion\/.*\/relion\/micrographs/micrographs/g' micrographs_all_gctf.star

每条线都需要两次修正。

/data/kollman/appion/17nov14d/relion/micrographs/00001_nonDW.mrc /data/kollman/appion/17nov14d/relion/micrographs/00001_nonDW.ctf:mrc 18326.289062 19408.296875    74.539665   120.000000     2.120000     0.200000 87500.000000    14.000000    -0.032973     3.656274
/data/kollman/appion/17nov14d/relion/micrographs/00002_nonDW.mrc /data/kollman/appion/17nov14d/relion/micrographs/00002_nonDW.ctf:mrc 19867.357422 20695.939453    48.760956   120.000000     2.120000     0.200000 87500.000000    14.000000    -0.034282     3.727132

需要转变为:

micrographs/00001_nonDW.mrc micrographs/00001_nonDW.ctf:mrc 18326.289062 19408.296875    74.539665   120.000000     2.120000     0.200000 87500.000000    14.000000    -0.032973     3.656274
micrographs/00002_nonDW.mrc micrographs/00002_nonDW.ctf:mrc 19867.357422 20695.939453    48.760956   120.000000     2.120000     0.200000 87500.000000    14.000000    -0.034282     3.727132

但相反,我得到的结果是:

micrographs/00001_nonDW.ctf:mrc 18326.289062 19408.296875    74.539665   120.000000     2.120000     0.200000 87500.000000    14.000000    -0.032973     3.656274
micrographs/00002_nonDW.ctf:mrc 19867.357422 20695.939453    48.760956   120.000000     2.120000     0.200000 87500.000000    14.000000    -0.034282     3.727132

问题似乎是我在这里使用通配符的方式。我需要拥有它,因为文件夹结构的那一部分总是会有所不同,因为这个命令可以推广到像这样的所有文件夹结构。星号是日期,总是会改变。

无论如何,外卡取代了预期的日期,但看起来它一直延伸到日期之后并且越过需要替换的第二个实例。结果是它删除了每行上的一个文件结构条目。

1 个答案:

答案 0 :(得分:0)

您的通配符.*匹配所有字符,直到/relion/micrographs的第二个实例。你需要一个更确定的模式。

另外,使用不同的sed表达式分隔符,这样您就不需要转义每个/

sed -E 's#/data/kollman/appion/[^ ]+/relion/micrographs#micrographs#g' file
  • 字符类[^ ]确保我们仅匹配非空格字符,并防止可能吞噬所有字符的贪婪匹配,直到/relion/micrographs的第二个实例。