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することでした:

 grep -c "." infile

これをしたくない理由は、別のテキスト ファイルを作成する権限がないためです。また、今ビルドしようとしているコードも簡単になります。

編集

明確にしたとは思いませんが、スクリプトが進むにつれて見ているアドレスが変化するため、ピリオドの数をより動的に見つけたいと考えています。

4

4 に答える 4

4

ドットを数える必要がなく、最後から 2 番目のドットとその後のすべてを削除するだけの場合は、Bash の組み込み文字列操作を使用できます。

${string%substring}の後ろ$substringからの 最短一致を削除します。$string

例:

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

素晴らしくシンプルで、、、または ! は必要ありsedませawkcut

于 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)として結合することによって機能します.が、フィールド ( ) の数はNF2 つ減っています。 コマンドの最後1の部分が出力を担当します。

これにより、ピリオドで区切られた最後の 2 つの項目が削除され、特定の入力行が削減されます。

このアプローチは「シェルに依存しない」:)

于 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 に答える