例如:
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)
谢谢〜
最佳答案
手册是开始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
作为前缀。关于sed - 如何理解复杂替换的sed?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14421940/