Bash 字符串的第一个字母不出现

Bash 字符串的第一个字母不出现,bash,shell,curl,geolocation,location,Bash,Shell,Curl,Geolocation,Location,我正在为我的学校制作一个IP详细信息脚本,但我遇到了一个错误 这是我的代码: State=$(curl -s http://www.ipinfodb.com/my_ip_location.php | cut -c42-999 | grep '</li>' | grep 'e : ' -B 1 | awk '{gsub("</li>", "");print}' | sed 's/[0-9]*//g' | awk '{gsub("e :", "");print}') echo

我正在为我的学校制作一个IP详细信息脚本,但我遇到了一个错误

这是我的代码:

State=$(curl -s http://www.ipinfodb.com/my_ip_location.php | cut -c42-999 |
grep '</li>' | grep 'e : ' -B 1 | awk '{gsub("</li>", "");print}' |
sed 's/[0-9]*//g' | awk '{gsub("e :", "");print}')
echo $State

任何帮助都将不胜感激

给定该HTTP URI的输出似乎是复杂的HTML,其行如下所示:

<21 spaces><li>State/Province : Western Australia</li>
awk
是一个单独的命令,它将选择前两列与所需匹配的行,将这些列设置为空字符串,删除
结束标记并输出结果

由于
awk
在开始时仍将输出空列之间的空格,因此
sed
将只删除前导空格


这样,您就不必担心行格式的微小变化,例如,如果它们开始放入更多的空格或使用制表符而不是空格缩进。您仍然需要担心诸如更改“州/省”位之类的重大更改,但这些更改的可能性应该要小得多。

考虑到HTTP URI的输出似乎是复杂的HTML,其中有一行,如:

<21 spaces><li>State/Province : Western Australia</li>
awk
是一个单独的命令,它将选择前两列与所需匹配的行,将这些列设置为空字符串,删除
结束标记并输出结果

由于
awk
在开始时仍将输出空列之间的空格,因此
sed
将只删除前导空格


这样,您就不必担心行格式的微小变化,例如,如果它们开始放入更多的空格或使用制表符而不是空格缩进。您仍然需要担心诸如更改“州/省”位之类的重大更改,但这些更改的可能性应该要小得多。

您可以使用来自的
hxpipe
(打包用于各种操作系统,例如作为Ubuntu的
html xml utils
hxpipe
使用命令行工具将HTML转换为可解析的内容

例如:

curl -s http://www.ipinfodb.com/my_ip_location.php | hxpipe | grep 'State/Province/'
-State/Province : Ontario
这更易于进一步处理,例如使用awk获取冒号后面的所有内容:

$ curl -s http://www.ipinfodb.com/my_ip_location.php | hxpipe |
awk -F" *: *" '/State\/Province/ {print $NF}'
Ontario

这告诉awk,字段由冒号分隔,周围有任意数量的空格。该命令本身选择与州/省匹配的行(就像第一个示例中的grep命令一样),然后打印该行的最后一个字段。

您可以使用来自的
hxpipe
(为各种操作系统打包,例如为Ubuntu打包为
html-xml-utils
hxpipe
使用命令行工具将HTML转换为可解析的内容

例如:

curl -s http://www.ipinfodb.com/my_ip_location.php | hxpipe | grep 'State/Province/'
-State/Province : Ontario
这更易于进一步处理,例如使用awk获取冒号后面的所有内容:

$ curl -s http://www.ipinfodb.com/my_ip_location.php | hxpipe |
awk -F" *: *" '/State\/Province/ {print $NF}'
Ontario

这告诉awk,字段由冒号分隔,周围有任意数量的空格。命令本身选择与州/省匹配的行(就像第一个示例中的grep命令一样),然后打印该行的最后一个字段。

sed
通常不是解析HTML的好工具,但在这种简单的情况下,它会有所帮助。试试这个:

State=$(curl -s http://www.ipinfodb.com/my_ip_location.php | sed -n 's/.*<li>State\/Province : \([^<]*\)<\/li>.*/\1/p')

sed
通常不是解析HTML的好工具,但在这种简单的情况下它会有所帮助。试试这个:

State=$(curl -s http://www.ipinfodb.com/my_ip_location.php | sed -n 's/.*<li>State\/Province : \([^<]*\)<\/li>.*/\1/p')

部分问题在于输出包含不可见字符,包括回车符(这使它返回到行的开头,然后有一个空格,它覆盖了“N”…)。请尝试
echo“$State”| cat-vet
查看不可见字符(回车符将显示为“^M”)。部分问题在于输出包含不可见字符,包括回车符(这使其返回到行的开头,然后有一个空格,它会覆盖“N”…)。尝试
echo“$State”| cat-vet
查看不可见物(回车将显示为“^M”)。