0

好的,所以我想弄清楚的是如何计算字符串中的句点数,然后将所有内容削减到该点但减去 2。意思是这样的:

string="aaa.bbb.ccc.ddd.google.com"

number_of_periods="5"

number_of_periods=`expr $number_of_periods-2`

string=`echo $string | cut -d"." -f$number_of_periods`

echo $string

result: "aaa.bbb.ccc.ddd"

我正在考虑这样做的方式是将字符串发送到文本文件,然后只是像这样搜索次数:

 grep -c "." infile

我不想这样做的原因是因为我想避免创建另一个文本文件,因为我没有这样做的权限。我现在尝试构建的代码也会更简单。

编辑

我认为我没有说清楚,但我想让查找周期数更加动态,因为我要查看的地址会随着脚本的前进而改变。

4

4 回答 4

4

如果您不需要计算点,而只需删除倒数第二个点以及之后的所有内容,则可以使用 Bash 的内置字符串操作

${string%substring}$substring删除的后面的 最短匹配项$string

例子:

$ string="aaa.bbb.ccc.ddd.google.com"
$ echo ${string%.*.*} 
aaa.bbb.ccc.ddd

又好又简单,不需要sedawk或者cut

于 2012-07-24T12:34:29.660 回答
2

那这个呢:

echo "aaa.bbb.ccc.ddd.google.com"|awk 'BEGIN{FS=OFS="."}{NF=NF-2}1'

(通过@steve 的有用评论进一步缩短)

给出:

aaa.bbb.ccc.ddd

awk命令:

    awk 'BEGIN{FS=OFS="."}{NF=NF-2}1'

通过将输入行分隔为字段 ( FS) 来工作.,然后将它们作为输出 ( OFS) 与连接起来.,但字段 ( NF) 的数量已减少 2。1命令中的 final 负责打印。

这将通过消除最后两个以句点分隔的项目来减少给定的输入行。

这种方法是“与外壳无关的”:)

于 2012-07-24T12:34:56.100 回答
0

也许这会有所帮助:

#!/bin/sh

input="aaa.bbb.ccc.ddd.google.com"

number_of_fields=$(echo $input | tr "." "\n" | wc -l)
interesting_fields=$(($number_of_fields-2))

echo $input | cut -d. -f-${interesting_fields}
于 2012-07-24T12:34:36.590 回答
0
grep -o "\." <<<"aaa.bbb.ccc.ddd.google.com" | wc -l
5
于 2012-07-24T12:38:21.833 回答