Bash 如何获取标记中间的文本?

Bash 如何获取标记中间的文本?,bash,sed,Bash,Sed,这是我的输出,但我得到的只是 Some Text: Some Text: Some Text: Some Text: More Text Some Text: More Text 这是我在linux中的shell脚本函数 Some Text: Some Text: Some Text: More Text #/垃圾箱/垃圾箱 sed-n-e's/*\(.*\)./\1/p'$1>临时 sed-e

这是我的输出,但我得到的只是

      Some Text:
      Some Text:
      Some Text:
      Some Text: More Text 
      Some Text: More Text
这是我在linux中的shell脚本函数

      Some Text:
      Some Text:
      Some Text: More Text
#/垃圾箱/垃圾箱
sed-n-e's/*
  • \(.*\)./\1/p'$1>临时
    sed-e的/这里是GNU awk的一种方式(第一行是空行):

    $gawk'
    RT==“||RT==”
  • “&&NF{ gsub(/^*|*$/,“”) 打印文件“%s%s”,(ORS=!(NR%2)?:“\n”),$0 } 结束{print“\n”}RS='|'文件 一些文本: 一些文本: 一些文本: 一些文本: 一些文本:更多文本 一些文本:更多文本
    这里是GNU awk的一种方式(第一行是空行):

    $gawk'
    RT==“||RT==”“&&NF{
    gsub(/^*|*$/,“”)
    打印文件“%s%s”,(ORS=!(NR%2)?:“\n”),$0
    }
    结束{print“\n”}RS='|'文件
    一些文本:
    一些文本:
    一些文本:
    一些文本:
    一些文本:更多文本
    一些文本:更多文本
    
    您的第一行sed不符合您的要求: 每行仅匹配一个事件

    #!/bin/sh
    
    sed-n-e's/*
  • \(.*\)./\1/p'$1>temp 这个^^
  • 哪一项与……线路的其余部分相匹配(显然不是您所期望的)

    一个快速解决方法是在任何其他处理之前,将每个
    更改为
    加换行符

    sed -n -e 's/.*<li>\(.*\)<\/li>.*/\1/p' $1 > temp
    this...........................^^
    
    #/垃圾箱/垃圾箱
    sed-e's/\n/g'$1“|\
    sed-n-e的s/*
  • \(.*\)/\1/p'|\ sed-e的///g'>输出
  • 我不是sed专家…其他人可能有更优雅的解决方案

    您的第一行sed不符合您的要求: 每行仅匹配一个事件

    #!/bin/sh
    
    sed-n-e's/*
  • \(.*\)./\1/p'$1>temp 这个^^
  • 哪一项与……线路的其余部分相匹配(显然不是您所期望的)

    一个快速解决方法是在任何其他处理之前,将每个
    更改为
    加换行符

    sed -n -e 's/.*<li>\(.*\)<\/li>.*/\1/p' $1 > temp
    this...........................^^
    
    #/垃圾箱/垃圾箱
    sed-e's/\n/g'$1“|\
    sed-n-e的s/*
  • \(.*\)/\1/p'|\ sed-e的///g'>输出

  • 我不是sed专家…如果您不介意使用第三方工具,其他人可能会有一个更优雅的解决方案-多平台web抓取实用程序-它非常简单:

    #!/bin/sh
    
    sed -e 's/<\/li>/<\/li>\n/g' "$1" |\
    sed -n -e 's/.*<li>\(.*\)<\/li>/\1/p' |\
    sed -e 's/<[\/b]*>//g' >out
    

    这将提取所有(顶级)
    li
    元素的纯文本内容,并将每个元素打印在单独的行上,以生成所需的输出。

    如果您不介意使用第三方工具多平台web抓取实用程序,它非常简单:

    #!/bin/sh
    
    sed -e 's/<\/li>/<\/li>\n/g' "$1" |\
    sed -n -e 's/.*<li>\(.*\)<\/li>/\1/p' |\
    sed -e 's/<[\/b]*>//g' >out
    
    这将提取所有(顶级)
    li
    元素的纯文本内容,并将每个元素打印在单独的行上,以生成所需的输出。

    第一件事:一般来说,使用理解HTML的工具(参见我的另一个答案)而不是用于HTML解析的
    awk
    sed
    ——正如@chepner简洁地指出的那样:

    不要用sed或awk解析HTML;sed用于基于行的编辑,awk用于基于字段的任务。两者都不适用于元素可能跨越多行的一般结构化文本

    因此,下面的解决方案在有限的情况下有效,但不能很好地概括


    @jaypal已经提供了一个特定于GNU的答案。
    这里有一个应该与接受正则表达式作为输入记录分隔符(
    RS
    )的所有
    awk
    风格一起使用的(例如
    gawk
    mawk
    nawk

    这两种解决方案都会从输出行中删除前导和尾随空格。

    第一件事:一般来说,使用理解HTML的工具(参见我的另一个答案),而不是使用
    awk
    sed
    进行HTML解析-正如@chepner简洁地说的那样:

    不要用sed或awk解析HTML;sed用于基于行的编辑,awk用于基于字段的任务。两者都不适用于元素可能跨越多行的一般结构化文本

    因此,下面的解决方案在有限的情况下有效,但不能很好地概括


    @jaypal已经提供了一个特定于GNU的答案。
    这里有一个应该与接受正则表达式作为输入记录分隔符(
    RS
    )的所有
    awk
    风格一起使用的(例如
    gawk
    mawk
    nawk


    这两种解决方案都会从输出行中删除前导和尾随空格。

    非常感谢您的帮助。但是,是否仍然可以使用awk和sed执行此操作,因为我对shell非常陌生script@user1574779你在用什么操作系统?很可能您的
    awk
    指向了
    gawk
    。我试图理解awk的功能。无论如何thanks@user1574779如果你是指LinuxMint,那么使用
    awk
    运行确切的命令。真的非常感谢你的帮助。但是有没有使用awk和sed这样做,因为我对shell非常陌生script@user1574779你在用什么操作系统?很可能您的
    awk
    指向了
    gawk
    。我试图理解awk的功能。无论如何thanks@user1574779如果您的意思是LinuxMint,那么使用
    awk
    运行确切的命令。不要使用
    sed
    awk
    解析HTML
    sed
    用于基于行的编辑,而
    awk
    用于基于字段的任务。两者都不适用于元素可能跨越多行的一般结构化文本。请勿使用
    sed
    awk
    解析HTML
    sed
    用于基于行的编辑,而
    awk
    用于基于字段的任务。两者都不适用于元素可能跨越多行的一般结构化文本。
    xidel file.html -e '/li'
    
    awk -v RS='</?li>\n*' '
     /^<b>/ { t=$0; gsub(/<\/?b>/, "", t); gsub(/^ +| +$/, "", t); print t}
    ' file
    
     sed -E 's/<\/?li>/\'$'\n''/g' file | 
      sed -En '/^<pg>/! { /[^ ]/ { s/<\/?b>//g; s/^ +| +$//gp; }; }'