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

sam*_*sam 2 sed

例如:

  sed 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' abc.txt
Run Code Online (Sandbox Code Playgroud)

那些含义是什么,例如'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)    
Run Code Online (Sandbox Code Playgroud)

谢谢〜

Wiv*_*aro 5

该手册是启动http://www.gnu.org/software/sed/manual/sed.html的好地方

打破这个特定的命令:

sed 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' abc.txt
Run Code Online (Sandbox Code Playgroud)

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

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

对于正则表达式\(\)分隔捕获组,\?意味着"可选地匹配前一个原子(匹配零次或一次)"(前一个原子是该组).字符的其余部分作为匹配,所以这意味着它将匹配/lib/ld,/lib64/ld,/lib32/ld/lib6432/ld.

在替换中,&包括整个匹配,因此它有效地为所有匹配添加前缀/tools.