5

次のBashコマンドラインでは、部分文字列が二重引用符で囲まれている場合に、部分文字列のインデックスを取得できます。

text='123ABCabc((XYZabc((((((abc123(((123'

echo $text | awk '{ print index($0, "((((a" )}'  # 20 is the result.

ただし、私のアプリケーションでは、この例の「a」がどこにあるのかわかりません。したがって、「a」を「(」以外の文字を受け入れる正規表現に置き換えることができると思いました。/[^(} /)が必要だと思いました。しかし、Awkインデックスを取得できませんでした。例の"((((a"の代わりに任意の形式の正規表現を使用するコマンド。

更新: William Pursellは、インデックス操作が2番目のオペランドとして正規表現を受け入れないことを指摘しました。

最終的に、私が達成しようとしていたのは、4つ以上の「(」の後に1つ以上の「)」が続く部分文字列を抽出することでした。Dennis Williamsonは、次のコードでソリューションを提供しました。

echo 'dksjfkdj(((((((I-WANT-THIS-SUBSTRING)askdjflsdjf' | 
mawk '{match($0,/\(\(\(\([^()]*\)/); s = substr($0,RSTART, RLENGTH); gsub(/[()]/, "", s); print s}'

助けてくれてありがとう!

4

3 に答える 3

3

それらのシーケンスの後に最初の非開き括弧​​の位置を取得するには:

$ echo "$text" | awk '{ print match($0, /\(\(\(\(([^(])/, arr); print arr[1, "start"]}'
20
24

これは、部分文字列 "((([^(]" (20)) の位置と、括弧の後の文字の位置 (24) を示しています。

これを行う機能match()は、GNU ( gawk) 拡張機能です。

編集:

echo 'dksjfkdj(((((((I-WANT-THIS-SUBSTRING)askdjflsdjf' | 
    mawk '{match($0,/\(\(\(\([^()]*\)/); s = substr($0,RSTART, RLENGTH); gsub(/[()]/, "", s); print s}'
于 2012-05-31T16:14:56.343 に答える
2

一致内のさらに別の部分文字列の開始を見つけるために 4 つ以上の開き括弧を一致させたい場合は、実際に値を計算する必要があります。

# Use GNU AWK to index the character after the end of a substring.
echo "$text" |
awk --re-interval 'match( $0, /\({4,}/ ) { print RSTART + RLENGTH }'

これにより、一連の括弧に続く文字の正しい開始インデックス (この場合は 24) が得られます。

于 2012-05-31T16:09:14.190 に答える
1

matchインデックスの代わりに必要です。そして、あなたはsを脱出する必要があります(。例えば:

echo $text | awk '{ print match($0, /\(\(\(\([^(]/) }'

これは、文字列の後の文字((((のインデックスではなく、最初ののインデックスを提供することに注意してください(

于 2012-05-31T15:45:12.137 に答える