【问题标题】:sed - get only text in between without spacessed - 只获取中间没有空格的文本
【发布时间】:2021-11-17 23:55:27
【问题描述】:

如何在此 SED 语句中的 - 之间获取文本?

通过

sed -n 's/.* - \\([^.]*\\).*/\\1/p'

文件内容

2021-08-25_@lumpsum_7000607227442711813 - App-using - ZMRUGEoLc_.mp4

实际

ZMRUGEoLc_

想要的(没有开始和结束的空格)

App-using

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    使用sed,您可以使用

    sed -n 's/.* - \(.*\) - .*/\1/p' file
    

    这里,.* - \(.*\) - .* 匹配任何文本,空格+-+空格,捕获直到空格+-+空格的任何文本,然后匹配字符串的其余部分。整个匹配被捕获的值替换并打印该值。

    online demo

    #!/bin/bash
    s='2021-08-25_@lumpsum_7000607227442711813 - App-using - ZMRUGEoLc_.mp4'
    sed -n 's/.* - \(.*\) - .*/\1/p' <<< "$s"
    # => App-using
    

    使用awk,您可以使用

    awk -F' - ' '{print $2}' file
    

    this online demo:

    #!/bin/bash
    s='2021-08-25_@lumpsum_7000607227442711813 - App-using - ZMRUGEoLc_.mp4'
    awk -F' - ' '{print $2}' <<< "$s"
    # => App-using
    

    这里,字段分隔符模式设置为空格+-+空格并打印字段 2。

    【讨论】:

      【解决方案2】:

      您可以使用此sed 来提取匹配项

      sed -E 's/.[^A-Z]*(.[^ ]*).*/\1/' input_file
      sed -E 's/.*- (.[^ ]*) .*/\1/' input_file
      

      输出

      $ sed -E 's/.[^A-Z]*(.[^ ]*).*/\1/' input_file
      App-using
      

      【讨论】:

      • 虽然对此是正确的。它可能并不总是以字母开头。
      • @Lacer 确实,这就是我包含第二个示例的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 2014-05-02
      • 2011-11-09
      • 2017-09-27
      相关资源
      最近更新 更多