文字列内の文字の位置を確認する必要があります。
たとえば、文字列はですRAMSITALSKHMAN|1223333
。
grep -n '[^a-zA-Z0-9\$\~\%\#\^]'
|
与えられた文字列内の場所を見つける方法は?
答え1
-b
単純テキストに対して同じ位置にあるバイトオフセットを取得するために使用できます(UTF-8または同様のテキストには該当しません)。
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|'
14:|
上記では、-a
スイッチを使用してバイナリファイルで作業するときに入力をテキストとして使用し、一致する文字のみを出力するように-o
切り替えました。
場所のみを希望する場合は、grepを使用して場所のみを抽出できます。
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' | grep -oE '[0-9]+'
14
奇妙な出力が表示されたら、grepをチェックして色が有効になっていることを確認してください。--colors=never
grepに渡すか、grepコマンドの前にaを追加して色を無効にすることができます\
(これにより、エイリアスは無効になります)。たとえば、次のようになります。
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' --color=never | \grep -oE '^[0-9]+'
14
複数の一致を返す文字列の場合、パイプを介してhead -n1
最初の一致を取得します。
上記の両方を使用していて、実行可能ファイル(スクリプトなど)を介してgrepが「エイリアス」になっている場合、エイリアスを使用した場合にのみ後者は機能しません。
答え2
使用する場合強く打つシェルでは、外部プロセスを作成せずに純粋に組み込まれた操作を使用できます。grepまたはアッ:
$ str="RAMSITALSKHMAN|1223333"
$ tmp="${str%%|*}"
$ if [ "$tmp" != "$str" ]; then
> echo ${#tmp}
> fi
14
$
これはパラメータ拡張すべての文字列エントリをすべて削除し、|
一時変数に保存します。次に、一時変数の長さを測定してインデックスを取得します|
。
元の文字列の存在を確認していますif
。|
そうでない場合、一時変数は元の変数と同じです。
また、|
bash文字列をインデックス付けするときに便利なゼロベースのインデックス付けを提供します。ただし、1から始まるインデックスが必要な場合は、次のことができます。
$ echo $((${#tmp}+1))
15
$
答え3
努力する:
printf '%s\n' 'RAMSITALSKHMAN|1223333.' | grep -o . | grep -n '|'
出力:
15:|
これにより、1 ベースのインデックス位置が提供されます。
答え4
「expr match」または「expr index」を使用してこの操作を実行することもできます。
exprは$ string $ substringと一致します。ここで、 $substring は RE です。
echo `expr match "RAMSITALSKHMAN|1223333" '[A-Z]*.|'`
上記は、一致する部分文字列の長さを返すので、位置を提供します。
ただし、より具体的には、検索インデックスは次のとおりです。
mystring="RAMSITALSKHMAN|122333"
echo `expr index "$mystring" '|'`