2

例如:

  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)    

谢谢~

4

2 回答 2

6

该手册是一个很好的起点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-命令

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

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

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

于 2013-01-20T05:42:22.827 回答
2

在学习 sed 或 awk 之前,您需要先学习 REGEX。它们大多基于正则表达式。从这里开始正则表达式

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

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

于 2013-01-20T05:38:47.537 回答