如何理解sed与复杂的替换?

时间:2013-01-20 05:23:40

标签: sed

例如:

  sed 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' abc.txt

这些含义是什么,例如's','(','\'','&'和'@'?

如何找到一种正确而简单的学习sed的方法?

的abc.txt:

  #define GNU_USER_LINK_EMULATION32 "elf32%{EB:b}%{EL:l}tsmip"
  #define GNU_USER_LINK_EMULATION64 "elf64%{EB:b}%{EL:l}tsmip"
  #define GNU_USER_LINK_EMULATIONN32 "elf32%{EB:b}%{EL:l}tsmipn32"

  #define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1"
  #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld.so.1"
  #define GLIBC_DYNAMIC_LINKERN32 "/lib32/ld.so.1"
  #define UCLIBC_DYNAMIC_LINKERN32 "/lib32/ld-uClibc.so.0"
  #define BIONIC_DYNAMIC_LINKERN32 "/system/bin/linker32"
  #define GNU_USER_DYNAMIC_LINKERN32 \
    CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERN32, UCLIBC_DYNAMIC_LINKERN32, \
               BIONIC_DYNAMIC_LINKERN32)    

谢谢〜

2 个答案:

答案 0 :(得分:5)

手册是开始http://www.gnu.org/software/sed/manual/sed.html

的好地方

分解该特定命令:

sed 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' abc.txt

引号's@/lib\(64\)\?\(32\)\?/ld@/tools&@g'中的字符串是sed运行的单个参数命令,在这种情况下它是's'('substitute')命令http://www.gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command

使用的分隔符是@符号,因此正则表达式为/lib\(64\)\?\(32\)\?/ld,替换为/tools&。最后有一个'g'选项,它适用于每一行中的所有匹配,而不仅仅是第一行。

对于正则表达式,\(\)分隔捕获组,\?表示“可选地匹配前一个原子(匹配零次或一次)”(前一个原子是组)。其余字符按原样匹配,因此这意味着它将匹配/lib/ld/lib64/ld/lib32/ld/lib6432/ld

在替换中,&包含整个匹配,因此有效地将所有匹配作为/tools的前缀。

答案 1 :(得分:2)

在学习sed或awk之前,你需要先学习REGEX。他们大多是正则表达式。 从这里开始REGEX

然后你可以从这里开始sed http://www.grymoire.com/Unix/Sed.html

最好的方法是通过练习来学习。学习正则表达式后,开始查看来自SO的sed问题,看看人们如何回答。首先尝试解决自己,然后看看给出的答案