「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 モードの説明:
's/pattern/replace_string/'
- 交換モード。見つけてpattern
交換してくださいreplace_string
\([0-9]*\.\)\{3,3\}
-\([0-9]*\.\)\
3回繰り返されるパターンを探す(\{3,3\})
\([0-9]*\.\)\
0.
、およびに対応します12.
。2345345345.
.