sed通配符的行为不符合预期

sed通配符的行为不符合预期,sed,replace,wildcard,Sed,Replace,Wildcard,尝试将“/data/kollman/appion/*/relion/micrographs”替换为“micrographs” 每行需要两次更正 /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

尝试将“/data/kollman/appion/*/relion/micrographs”替换为“micrographs”

每行需要两次更正

/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
问题似乎是我在这里使用通配符的方式。我需要它,因为文件夹结构的这一部分总是会有所不同,因为这个命令旨在推广到所有这样的文件夹结构。星号表示日期,它总是变化的


无论如何,通配符会像预期的那样替换日期,但看起来它会一直延伸到日期之后,并跨越到需要替换的第二个实例。结果是,它在每一行删除一个文件结构条目。

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

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

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

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

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

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