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
解析HTMLsed
用于基于行的编辑,而awk
用于基于字段的任务。两者都不适用于元素可能跨越多行的一般结构化文本。请勿使用sed
或awk
解析HTMLsed
用于基于行的编辑,而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; }; }'