【问题标题】:sed , awk : find pattern and 20 char beforesed , awk :在之前找到模式和 20 个字符
【发布时间】:2014-10-07 20:06:56
【问题描述】:

我的文件太长了:

"196","02041873983107165016.jpg","0","0","0","0009.jpg","1"
"197","22326275984445946358.jpg","0","0","0","0011.jpg","1"
"198","94656137600921259484.jpg","0","0","0","0012.jpg","1"
"199","14489943688842089858.jpg","0","0","0","0013.jpg","1"
"200","04120962316412927503.jpg","0","0","0","0008.jpg","1"
"201","24360101806918799057.jpg","0","0","0","0009.jpg","1"
"202","48341366030411757581.jpg","0","0","0","0012.jpg","1"
"203","55697947255646026367.jpg","0","0","0","0013.jpg","1"
"204","73425273021963647924.jpg","0","0","0","2s0l92c.jpg","
.................

我想在这里获取文件名:.jpg 和 20 个字符:

73425273021963647924.jpg
55697947255646026367.jpg
............

如何使用 grep 、 sed 或 awk 做到这一点?

谢谢

【问题讨论】:

    标签: awk sed grep find


    【解决方案1】:

    鉴于该输入,您所需要的只是:

    cut -d\" -f4
    

    【讨论】:

      【解决方案2】:

      为了真正通用并提取每行第一次出现的“.jpg”以及之前的(最多)20 个字符,我建议使用以下两步 sed 解决方案:

      $ sed -r 's/(.{,20}\.jpg).*/\1/;s/.*(.{24})/\1/' file
      02041873983107165016.jpg
      22326275984445946358.jpg
      94656137600921259484.jpg
      14489943688842089858.jpg
      04120962316412927503.jpg
      24360101806918799057.jpg
      48341366030411757581.jpg
      55697947255646026367.jpg
      73425273021963647924.jpg
      25273021963647924.jpg
      

      这是对已编辑的 OP 问题的回答,最后一行在第一次出现“.jpg”之前仅包含 17 个字符。我们必须使用 sed 分两步完成,因为与 grep 一样,我们不能在括号中包含 .* before 模式保存,否则它将匹配 第二次出现“.jpg”就行了。

      否则,如果输入真的像 OP 给出的那样简单并且不出意外,我们可以使用带有 cut 的固定宽度字符串提取:

      $ cut -c 8-31 file
      

      提供相同的期望输出:

      02041873983107165016.jpg
      22326275984445946358.jpg
      94656137600921259484.jpg
      14489943688842089858.jpg
      04120962316412927503.jpg
      24360101806918799057.jpg
      48341366030411757581.jpg
      55697947255646026367.jpg
      73425273021963647924.jpg
      

      【讨论】:

        【解决方案3】:

        使用 awk 提取 .jpg 之前的 20 个字符并包含 .jpg

        awk '$0=substr($0,index($0,".jpg")-20,24)' file
        
        02041873983107165016.jpg
        22326275984445946358.jpg
        94656137600921259484.jpg
        14489943688842089858.jpg
        04120962316412927503.jpg
        24360101806918799057.jpg
        48341366030411757581.jpg
        55697947255646026367.jpg
        73425273021963647924.jpg
        

        【讨论】:

          【解决方案4】:

          使用 awk:

          awk -F\" '{ print $4 }' file
          

          输出:

          02041873983107165016.jpg
          22326275984445946358.jpg
          94656137600921259484.jpg
          14489943688842089858.jpg
          04120962316412927503.jpg
          24360101806918799057.jpg
          48341366030411757581.jpg
          55697947255646026367.jpg
          73425273021963647924.jpg
          

          【讨论】:

          • 假设您有 OPs 问题但没有示例输入,这仅适用于此特定示例并且不考虑之前的字符数。
          • @Jidder 有可能 OP 只是没有看到更简单的方法。我还设想了您的解决方案(使用substr),但我选择不让它变得复杂。
          • @Jidder 我支持 konsolebox,我认为这是 OP 告诉我们他们想要什么解决方案的经典案例,因为这就是他们所知道的,而不是告诉我们他们的要求是什么。此处的大多数或所有解决方案都依赖于完全如图所示的输入(例如,考虑您对不包含 .jpg 的行的处理方式),就像这个答案一样。
          • @EdMorton 我知道 OP 可能不知道这是一个选项,但问题的标题是在模式前找到 20 个字符。此答案不包括模式或查找先前字符的方法。如果我搜索了这个问题并且这是唯一的答案,我会非常失望,而且帮助不大。我想这个问题可以改变。另外 .jpg 只是要搜索的模式的一个例子。
          【解决方案5】:

          试试这条 grep 行:

          grep -Eo '[^",]{20}[.]jpg' file
          

          用你的例子,它输出:

          kent$  grep -Eo '[^",]{20}[.]jpg' f  
          02041873983107165016.jpg
          22326275984445946358.jpg
          94656137600921259484.jpg
          14489943688842089858.jpg
          04120962316412927503.jpg
          24360101806918799057.jpg
          48341366030411757581.jpg
          55697947255646026367.jpg
          73425273021963647924.jpg
          

          【讨论】:

          • 我对 Jidder 对 konsolebox 给出的答案的评论第二:您建议的答案不严格符合 OP 的要求“在线上的(第一次)出现的“.jpg”和前 20字符(或直到行首),无论这些字符是什么。我相信你注意到了更简单、更直接的grep -Eo '.{20}\.jpg' essai 的奇怪行为,它在输入的最后一行出错了,但我们必须面对这一点,而不是提供[^",] 解决方法,呵呵... ;)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-16
          • 1970-01-01
          • 2021-12-24
          • 1970-01-01
          • 2014-09-07
          相关资源
          最近更新 更多