好的,我想弄清楚的是我如何计算字符串中的句点数,然后将所有内容剪切到该点但减去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
我不想这样做的原因是因为我想避免创建另一个文本文件,因为我无权这样做。对于我正在尝试构建的代码,它也会更简单。
修改
我认为我没有说清楚,但我想让查找句点的数量更加动态,因为我将要查看的地址会随着脚本向前移动而改变。
答案 0 :(得分:4)
如果您不需要计算点,但只是删除倒数第二个点以及之后的所有内容,您可以使用Bash的内置string manuipulation。
${string%substring}
从$substring
的返回中删除$string
的最短匹配。
示例:
$ string="aaa.bbb.ccc.ddd.google.com"
$ echo ${string%.*.*}
aaa.bbb.ccc.ddd
简单明了,不需要sed
,awk
或cut
!
答案 1 :(得分: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
负责打印。
这将通过消除最后两个句点分隔项来减少给定的输入行。
这种方法是" shell-agnostic " :)
答案 2 :(得分: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}
答案 3 :(得分:0)
grep -o "\." <<<"aaa.bbb.ccc.ddd.google.com" | wc -l
5