【问题标题】:sed: multiple patterns on the same output linesed:同一输出行上的多个模式
【发布时间】:2018-10-04 00:52:06
【问题描述】:

我有这个文件(languages.txt),用sed从其他格式的文件中获得:

language   "Afar"
territory  "Djibouti"
language   "Afar"
territory  "Eritrea"
language   "Afar"
territory  "Eritrea"
language   "Afar"
territory  "Ethiopia"
...

我想在同一行中获得类似“语言(地区)”的结果:

Afar (Djbouti)
Afar (Eritrea)
Afar (Ethiopia)
...

我正在使用这个命令,但没有得到想要的结果:

sed -nE 's/^language|territory\s+\"(.+)\"$/\1 \2/p'

【问题讨论】:

    标签: shell sed grep sh


    【解决方案1】:

    glen jackman's sed answer 的笨拙且更脆弱的版本,只有一个 s 命令:

    sed 'N;s/^.*"\(.*\)".*"\(.*\)"/\1 (\2)/' languages.txt 
    

    假设文件顺序是严格的,所以奇数行是语言,偶数行是语言环境。还假设引用格式是单调一致的。

    输出:

    Afar (Djibouti)
    Afar (Eritrea)
    Afar (Eritrea)
    Afar (Ethiopia)
    

    【讨论】:

      【解决方案2】:

      使用awk 可能会更容易...

      $ awk -F'"' '!(NR%2){print v, "(" $2 ")"} {v=$2}' file
      
      Afar (Djibouti)
      Afar (Eritrea)
      Afar (Eritrea)
      Afar (Ethiopia)
      

      将分隔符设置为引号,捕获值,如果行号甚至打印格式中的值。

      如果要过滤重复项

      $ awk -F'"' '!(NR%2) && !a[v,$2]++{print v, "(" $2 ")"} {v=$2}' file
      
      Afar (Djibouti)
      Afar (Eritrea)
      Afar (Ethiopia)
      

      【讨论】:

        【解决方案3】:

        假设整个文件是成对的“语言”和“地区”行,那么

        sed 's/language \+"\(.\+\)"/\1/; N; s/\nterritory \+"\(.\+\)"/ (\1)/' languages.txt
        

        扩展:

        sed '
            # remove the language and quotes, leaving just the language
            s/language \+"\(.\+\)"/\1/
        
            # append a newline and read the next line
            N
        
            # remove the newline, territory and quotes
            s/\nterritory \+"\(.\+\)"/ (\1)/
        
            # implicitly print
        ' languages.txt
        

        【讨论】:

          猜你喜欢
          • 2023-03-10
          • 2018-08-24
          • 1970-01-01
          • 1970-01-01
          • 2018-01-08
          • 1970-01-01
          • 2016-07-06
          • 2018-04-30
          • 1970-01-01
          相关资源
          最近更新 更多