相关疑难解决方法(0)

提取与“sed”匹配的正则表达式而不打印周围的字符

致所有的“sed”医生:

你怎么能得到'sed'来提取它在一行中匹配的正则表达式?

换句话说,我只想要与正则表达式相对应的字符串,其中包含行中的所有非匹配字符都被剥离。

我尝试使用如下所示的反向引用功能

regular expression to be isolated 
         gets `inserted` 
              here     
               |
               v  
 sed -n 's/.*\( \).*/\1/p 
Run Code Online (Sandbox Code Playgroud)

这适用于某些表达式,例如

 sed -n 's/.*\(CONFIG_[a-zA-Z0-9_]*\).*/\1/p 
Run Code Online (Sandbox Code Playgroud)

它巧妙地提取了所有以 'CONFIG_ ....' 开头的宏名称(在某些 '*.h' 文件中找到)并逐行打印出来

          CONFIG_AT91_GPIO
          CONFIG_DRIVER_AT91EMAC
                   .
                   .   
          CONFIG_USB_ATMEL
          CONFIG_USB_OHCI_NEW
                   .
                 e.t.c. 
Run Code Online (Sandbox Code Playgroud)

但是上面的内容分解为类似的东西

  sed -n 's/.*\([0-9][0-9]*\).*/\1/p 
Run Code Online (Sandbox Code Playgroud)

这总是返回个位数,如

                 7
                 9
                 .
                 .  
                 6
Run Code Online (Sandbox Code Playgroud)

而不是提取连续的数字字段,例如。

              8908078
              89670890  
                 .
                 .  
                 .
               23019   
                 .
               e.t.c.  
Run Code Online (Sandbox Code Playgroud)

PS:我将非常感谢关于如何在“sed”中实现这一点的反馈。我知道如何使用“grep”和“awk”来做到这一点我想知道我对“sed”的理解(尽管有限)是否有漏洞,以及是否有办法在我
拥有的“sed”中做到这一点简直被忽视了。

sed

27
推荐指数
3
解决办法
6万
查看次数

使用 sed 提取文本无法按预期工作

我刚刚开始使用sed,我打算用它从ping输出中提取 IP 地址。这就是我正在努力实现的目标:

输入文本:

ytmti (192.188.2.3) jjggy
Run Code Online (Sandbox Code Playgroud)

所需的输出:

192.188.2.3
Run Code Online (Sandbox Code Playgroud)

我正在尝试的命令:

echo "ytmti (192.188.2.3) jjggy" | sed 's:\((\(192.188.2.3\))\):\2:' 
Run Code Online (Sandbox Code Playgroud)

电流输出:

ytmti 192.188.2.3 jjggy
Run Code Online (Sandbox Code Playgroud)

注:ytmtijjggy真正替身文字像Pinging unix.stackexchange.comwith 32 bytes of data:

我认为 usingawk可能是解析ping输出的更好解决方案,但我想习惯sed.

sed awk

4
推荐指数
1
解决办法
390
查看次数

用于词干的 Grep 并仅打印单词(而不是行)

我正在尝试仅打印通过正则表达式找到的匹配单词。下面,我想要OPENSSL_NO_*源代码中存在的所有选项:

$ grep -IR OPENSSL_NO
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_CMS
fuzz/asn1.c:#ifndef OPENSSL_NO_DH
fuzz/asn1.c:#ifndef OPENSSL_NO_EC
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_OCSP
fuzz/asn1.c:#ifndef OPENSSL_NO_TS
fuzz/asn1.c:#ifndef OPENSSL_NO_DH
fuzz/asn1.c:#ifndef OPENSSL_NO_DSA
...
Run Code Online (Sandbox Code Playgroud)

当我尝试通过仅打印完整单词来修剪输出时:

$ grep -oIR "OPENSSL_NO*"
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
...
Run Code Online (Sandbox Code Playgroud)

当我尝试 awk 时,它会打印整行:

$ grep -IR OPENSSL_NO | awk '/OPENSSL_NO[_A-Z0-9_]/{ print $0 }'
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_CMS
fuzz/asn1.c:#ifndef OPENSSL_NO_DH
fuzz/asn1.c:#ifndef OPENSSL_NO_EC
...
Run Code Online (Sandbox Code Playgroud)

和:

$ grep -IR OPENSSL_NO | awk '/\<OPENSSL_NO\>'
awk: line 1: runaway regular expression /\<OPENSSL_ ...
Run Code Online (Sandbox Code Playgroud)

和: …

text-processing pattern-matching

2
推荐指数
1
解决办法
1万
查看次数

标签 统计

sed ×2

awk ×1

pattern-matching ×1

text-processing ×1