文字列から部分文字列を抽出する[閉じる]

文字列から部分文字列を抽出する[閉じる]

「2.0.1」と「2.0.12」の文字の前の文字を抽出する必要があります。次の文字列から sgdgfhfh-ZZZZZZ-ZZZ-2.0.1.ZZZ,sgdgfhfh-ZZZZZZ-ZZZ-2.0.12.ZZ :

努力しています:

#!/bin/bash
c=grep -o '[.0-9]*[0-9]' $1 
echo $c 

file$1は埋め込みテキストファイルで、ZZZZZZ-ZZZ-2.0.1.ZZZエラーが発生します。

line 2: -o: command not found

答え1

@Archemarが彼の意見で言ったように、あなたの命令は

c=grep -o '[.0-9]*[0-9]' $1

grepまったく実装されていません。変数をコマンド出力に設定する構文は次のとおりです。

c=$(grep -o '[.0-9]*[0-9]' $1)

$(command)このコマンドの出力に置き換えられます。

しかし、なぜこのような奇妙なエラーメッセージが表示されるのですか?コマンドを実行する前に変数の割り当てが有効であるためです。これは、変数がこのコマンドに対してのみ設定されていることを意味します。これは、変数を永久に設定または変更したくない場合に便利です。したがって、あなたの行は、「変数がc文字列に設定され、コマンドがパラメータでgrep実行される必要があるため、-oコマンドは検索されますが見つかりません」と解釈されます。'[.0-9]*[0-9]'$1-o

答え2

grep以下を試すことができない場合sed

sed 's/\([0-9]*\.\)\{3,3\}.*$//'

入力は以下で提供されます。 echo:

echo "sgdgfhfh-ZZZZZZ-ZZZ-2.0.12.ZZ" | sed 's/\([0-9]*\.\)\{3,3\}.*$//' 

Bashスクリプトから:

まずファイルを作成します。

nano script.sh

スクリプトに次のコードを追加します。

#!/bin/bash

echo "$1" | sed 's/\([0-9]*\.\)\{3,3\}.*$//'

保存と終了。実行権限を追加します。

chmod u+x script.sh

script.sh入力パラメータとして実行($1スクリプト内)

./script.sh "sgdgfhfh-ZZZZZZ-ZZZ-2.0.12.ZZ"

出力は次のとおりです。

sgdgfhfh-ZZZZZZ-ZZZ-

sed モードの説明:

  1. 's/pattern/replace_string/'- 交換モード。見つけてpattern交換してくださいreplace_string

  2. \([0-9]*\.\)\{3,3\}- \([0-9]*\.\)\3回繰り返されるパターンを探す(\{3,3\})

\([0-9]*\.\)\0.、およびに対応します12.2345345345..

関連情報