如何理解复杂替换的sed?

如何理解复杂替换的sed?,sed,Sed,对于exmaple: 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}tsm

对于exmaple:

  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)    

谢谢~

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

然后你可以从这里开始


最好的方法是通过实践学习。学习regex后,开始查看SO提出的sed问题,看看人们是如何回答的。首先尝试解决自己的问题,然后查看给出的答案。

手册是一个很好的起点

分解该特定命令:

sed 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' abc.txt
引号
's@/lib\(64\)\?\(32\)\?/ld@/tools&@g'
中的字符串是sed要运行的单参数命令,在本例中是's'('substitute')命令

这里使用的分隔符是@符号,因此regexp是
/lib\(64\)\(32\)\?/ld
,替换的是
/tools&
。末尾有一个“g”选项,它适用于每行中的所有匹配项,而不仅仅是第一行

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


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

您的abc.txt与您的问题之间有什么关系?我使用它输入sed命令。一旦您理解了该命令,您将学习到正确使用sed所需的99%知识(其余部分是使用\1等反向引用)。不要为书籍、教程等操心,因为它们大多只是告诉您如何在中正确使用sed。我不太明白为什么我不能忽略/ld?例如sed的\uu/lib(64)\?(32)\uu/tools和\u g'abc.txt为什么这个cmd只匹配/lib32?因为您有:
(64)\?
这意味着
64
或者什么都没有,并且总是
32
。您使用的是扩展regexp吗?也许您真正想要的是:
s,/lib\(32\;64\)\?/,/tools&,g
+1非常完整的答案。一些sed有一个
-r
选项,允许您省去反斜杠:
sed-r's@/lib(64)?(32)?/ld@/tools&@g'