Linux 在Bash中将字符串裁剪为特定字符
我正在尝试制作一个bash脚本,它将告诉我Linux内核的最新稳定版本 问题是,虽然我可以删除某些字符之后的所有内容,但似乎无法删除某些字符之前的所有内容Linux 在Bash中将字符串裁剪为特定字符,linux,string,bash,posix,trim,Linux,String,Bash,Posix,Trim,我正在尝试制作一个bash脚本,它将告诉我Linux内核的最新稳定版本 问题是,虽然我可以删除某些字符之后的所有内容,但似乎无法删除某些字符之前的所有内容 #!/bin/bash wget=$(wget --output-document - --quiet www.kernel.org | \grep -A 1 "latest_link") wget=${wget##.tar.xz\">} wget=${wget%</a>} echo "${wget}" #/bin
#!/bin/bash
wget=$(wget --output-document - --quiet www.kernel.org | \grep -A 1 "latest_link")
wget=${wget##.tar.xz\">}
wget=${wget%</a>}
echo "${wget}"
#/bin/bash
wget=$(wget——输出文档----quiet www.kernel.org |\grep-a1“最新链接”)
wget=${wget###tar.xz\“>}
wget=${wget%}
回显“${wget}”
不知何故,输出“忽略”了
wget=${wget###.tar.xz\“>}
行。您试图从字符串开头删除模式.tar.xz\“>
的最长匹配项,但字符串不是以.tar.xz
开头的,因此没有匹配项
你必须使用
wget=${wget##*.tar.xz\">}
然后,因为您在脚本中而不是交互式shell中,所以不需要转义\grep
(可能是为了防止使用别名),因为别名在非交互式shell中是禁用的
而且,正如所指出的,将变量命名为与现有命令相同的命令(通常是:test
)必然会导致混淆
如果您想使用专门用于处理HTML的命令行工具,可以查看(Ubuntu:apt install HTMLXML UTIL
)。使用它们,您可以获得如下所示的信息:
$ curl -sL www.kernel.org | hxselect 'td#latest_link' | hxextract a -
4.10.8
或者,详细地说:
curl -sL www.kernel.org | # Fetch page
hxselect 'td#latest_link' | # Select td element with ID "latest_link"
hxextract a - # Extract link text ("-" for standard input)
您正在尝试从字符串的开头删除模式
.tar.xz\“>
的最长匹配项,但字符串的开头不是.tar.xz
,因此不存在匹配项
你必须使用
wget=${wget##*.tar.xz\">}
然后,因为您在脚本中而不是交互式shell中,所以不需要转义\grep
(可能是为了防止使用别名),因为别名在非交互式shell中是禁用的
而且,正如所指出的,将变量命名为与现有命令相同的命令(通常是:test
)必然会导致混淆
如果您想使用设计用于处理HTML的命令行工具,可以查看(Ubuntu:apt install HTMLXMLUTILS
)。使用它们,您可以获得以下所需信息:
$ curl -sL www.kernel.org | hxselect 'td#latest_link' | hxextract a -
4.10.8
或者,详细地说:
curl -sL www.kernel.org | # Fetch page
hxselect 'td#latest_link' | # Select td element with ID "latest_link"
hxextract a - # Extract link text ("-" for standard input)
每当我需要在bash中提取一个子字符串时,我总是看看是否可以通过几个cut(1)命令强制执行它。在您的情况下,以下各项似乎有效:
wget=$(wget --output-document - --quiet www.kernel.org | \grep -A 1 "latest_link")
echo $wget | cut -d'>' -f3 | cut -d'<' -f1
wget=$(wget——输出文档——安静的www.kernel.org |\grep——1“最新链接”)
echo$wget | cut-d'>'-f3 | cut-d'每当我需要在bash中提取子字符串时,我总是看看是否可以通过几个cut(1)命令强制执行它。在您的情况下,以下各项似乎有效:
wget=$(wget --output-document - --quiet www.kernel.org | \grep -A 1 "latest_link")
echo $wget | cut -d'>' -f3 | cut -d'<' -f1
wget=$(wget——输出文档——安静的www.kernel.org |\grep——1“最新链接”)
echo$wget | cut-d'>'-f3 | cut-d'不建议使用shell工具grep、awk、sed等解析HTML文件
但是,如果您想要一个快速的一行,那么这个awk应该可以:
get --output-document - --quiet www.kernel.org |
awk '/"latest_link"/ { getline; n=split($0, a, /[<>]/); print a[n-2] }'
4.10.8
get--输出文档----quiet www.kernel.org|
awk'/“最新链接”/{getline;n=split($0,a,/[]/);打印[n-2]}”
4.10.8
不建议使用shell工具grep、awk、sed等来解析HTML文件
但是,如果您想要一个快速的一行,那么这个awk应该可以:
get --output-document - --quiet www.kernel.org |
awk '/"latest_link"/ { getline; n=split($0, a, /[<>]/); print a[n-2] }'
4.10.8
get--输出文档----quiet www.kernel.org|
awk'/“最新链接”/{getline;n=split($0,a,/[]/);打印[n-2]}”
4.10.8
sed
方法:
wget --output-document - --quiet www.kernel.org | \
sed -n '/latest_link/{n;s/^.*">//;s/<.*//p}'
sed
方法:
wget --output-document - --quiet www.kernel.org | \
sed -n '/latest_link/{n;s/^.*">//;s/<.*//p}'
使用与命令同名的变量不是一个好的做法。使用RSS提要来获取版本,而不是解析kernel.org HTML。那么这只是解析它的问题。使用与命令同名的变量不是一个好的做法。使用RSS提要来获取版本,而不是解析kernel.org HTML。那么这只是解析它的问题。我使用\grep只是因为默认情况下Ubuntu将grep别名为grep--color=auto。通过调用默认grep,我避免了我的output@TommasoTheaCioni是的,但是别名在脚本中默认是关闭的,并且当打印到tty时,--color=auto
只打印终端颜色转义码,在其他情况下不打印,因此在交互式会话中甚至不存在问题。虽然不太重要。哦,好吧,我会把它去掉。@TommasoTheaCioni我的意思是,它不痛,但也没什么作用;)我使用\grep只是因为默认情况下Ubuntu将grep别名为grep--color=auto。通过调用默认grep,我避免了我的output@TommasoTheaCioni是的,但是别名在脚本中默认是关闭的,并且当打印到tty时,--color=auto
只打印终端颜色转义码,在其他情况下不打印,因此在交互式会话中甚至不存在问题。虽然不太重要。哦,好吧,我会把它去掉。@TommasoTheaCioni我的意思是,它不痛,但也没什么作用;)