【问题标题】:How do I delete everything after the 3rd 4rth occurrence of a character using sed/grep/regex如何使用 sed/grep/regex 在第 3 次第 4 次出现字符后删除所有内容
【发布时间】:2022-08-24 15:09:32
【问题描述】:

我需要一些帮助:寻找一种方法在使用类似命令的超链接中 \"/\" 的第 n 次出现(很可能是第 4 次或第 5 次)之后删除所有内容

cat text.txt | grep -o \"^((?:[^/]*/){5}).*$\"

这个命令对我不起作用。例如,如果我有

https://www.forbes.com/forbes/welcome/?toURL=https://forbes.com/&refURL=&referrer=

我想要的输出是:

https://www.forbes.com/forbes/welcome/

此外,如果链接只有 < 4 /,我想保留所有内容。

  • 浏览互联网告诉我,也许你可以使用cut -d / -f -5
  • @JvdV,好主意,但如果? 不在恕我直言,这只是一个想法,干杯。
  • @RavinderSingh13,对,我没有注意到匹配 ? 的要求。感谢您指出了这一点。
  • 这看起来像XY Problem;你的问题陈述有多个你没有解释的极端情况,最终,你说你想要的结果不一定是你说你想要实现的逻辑的结果。

标签: regex sed grep


【解决方案1】:

第一种解决方案:使用awk 请尝试关注。它应该涵盖 /?? 在 URL 中出现的两种情况(实际请求中可能是这种情况)。只需将 Input_file 的所有行的字段分隔符设置为 /?\\? 并打印行的第一个字段(如果行从 httphttps 开始)。

awk -F'/?\\?' '/^https?:\/\//{print $1}' Input_file


第二种解决方案:使用 GNU awk 并使用其 match 函数,请尝试以下解决方案,与第一个解决方案相比有点复杂,但您可以尝试一下,以防您需要检查更多值,而不是在 ? 之前获取值,当时它可以帮助您,因为它将值保存到数组中。

awk 'match($0,/^(https?:\/\/([^?]*))\?/,arr1){print arr1[1]}' Input_file

【讨论】:

    【解决方案2】:

    假设?问号可以排除在哪里,你可以试试这个sed

    $ sed 's/?.*//' input_file
    https://www.forbes.com/forbes/welcome/
    

    【讨论】:

      【解决方案3】:

      您可以匹配协议,如果可用,请使用 grep -P 在其后重复匹配 3 次 / 的非捕获组:

      grep -oP "^https?://(?:[^/]*/){3}" text.txt
      

      或 grep -E 重复捕获组:

      grep -oE "^https?://([^/]*/){3}" text.txt
      

      或者只是使用正确的转义符 grep -o

      grep -o "^https\?://\([^/]*/\)\{3\}" text.txt
      

      例子

      echo "https://www.forbes.com/forbes/welcome/?toURL=https://forbes.com/&refURL=&referrer=" | grep -oP "^https?://(?:[^/]*/){3}"
      

      输出

      https://www.forbes.com/forbes/welcome/
      

      请注意,您不必使用cat text.txt |

      【讨论】:

        【解决方案4】:

        您可以使用此grep,它适用于任何版本的grep

        grep -oE '([^/]*/){5}' file
        
        https://www.forbes.com/forbes/welcome/
        

        同样,这个sed 也可以:

        sed -E 's~(([^/]*/){5}).*~\1~' file
        
        https://www.forbes.com/forbes/welcome/
        

        这两种解决方案都将获取由/ 分隔的前 5 个标记。

        【讨论】:

          【解决方案5】:
          awk 'NF<_||NF=_' FS=/ OFS=/ \_=5
          
             https://www.forbes.com/forbes/welcome
          

          【讨论】:

            【解决方案6】:

            如果 ? 问号可以排除在哪里,您可以尝试:

            cut -d '?' -f1 input_file
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-11-14
              • 1970-01-01
              • 1970-01-01
              • 2021-11-26
              • 1970-01-01
              • 1970-01-01
              • 2021-01-06
              • 2017-12-14
              相关资源
              最近更新 更多