Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在Bash中将字符串裁剪为特定字符_Linux_String_Bash_Posix_Trim - Fatal编程技术网

Linux 在Bash中将字符串裁剪为特定字符

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

我正在尝试制作一个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/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我的意思是,它不痛,但也没什么作用;)