0

私の状況はこれです-ファイルがあります:

this line(5)
that line(6)
another line(9)
one more(88)
last line(156)

括弧内の値をそれから次のように変更する必要があります。

this line(1)
that line(2)
another line(3)
one more(4)
last line(5)

基本的には1から順に値を並べます。

さて、ここに私のコードがあります:

#!/bin/bash

FILE=$1
COUNT=0
echo "Working with $FILE"

if [ -f $FILE ]; then
while read -r line; do 
    echo ${line/\([0-9]{1,3}\)/\($COUNT\)};
     let COUNT++;
  done < $FILE
else
  echo "File does not exist!"
fi

ここに私が得るものがあります:

this line(5))/(0)}
that line(6))/(1)}
another line(9))/(2)}
one more(88))/(3)}
last line(156))/(4)}

私は何を間違っていますか?正規表現で任意の長さを指定するにはどうすればよいですか?

とても有難い。

4

4 に答える 4

1

エコー行を次のように変更します。

echo ${line%%\([0-9]*\)}\($COUNT\)

編集:パターン置換バージョンも同様に機能します。行内の他の場所に数字を含む括弧がないことを前提としてい%ます/。 、 そのようです:

echo ${line/%\([0-9]*\)/\($COUNT\)}
于 2012-12-12T20:16:22.310 に答える
1

echo ${line/([0-9]*)/($COUNT)};

あなたのオリジナルは{}(何らかの理由でサポートされていません)、}変数を終了しました。()も (少なくともここでは) サポートされていないという事実は、それらをエスケープする必要がないことを意味します。

于 2012-12-12T20:16:54.037 に答える
1

正確ではないことに注意してください${line/([0-9]*)/($COUNT)}: パターン[0-9]*は数字の後に 0 個以上の任意の文字が続くことを意味します -- 数字に限定されません。例

line='foo(1abc)'
COUNT=2
echo ${line/([0-9]*)/($COUNT)}

出力foo(2)

正規表現の同等のbash パターン[0-9]+は拡張パターンです+([0-9])

shopt -s extglob
echo ${line/(+([0-9]))/($COUNT)}
于 2012-12-12T23:56:12.510 に答える
0

cat -n行番号を行とともに出力し、sed行番号を括弧に置き換えるために使用する別のアプローチを次に示します。

cat -n $FILE | sed 's/^ *\([0-9]*\)\t\(.*\)([0-9]*)/\2(\1)/'

正規表現行を次のように変更することで、ソリューションを機能させることができました。

echo ${line/([0-9]*)/($COUNT)};

ただし、繰り返し範囲をそこで機能させることができませんでした。

于 2012-12-12T20:07:24.163 に答える