3

このパターンのテキスト ファイルがあります。

\t (hello world)

かっこ内のテキストを一意の値 (ob1、obj2 など) に置き換える必要があります。

\t (obj)
\t (obj)
\t (obj)

なる...

\t (obj1)
\t (obj2)
\t (obj3)

または、他に類を見ないもの。cygwin で機能する任意のツールを使用するソリューションが機能します。これを行うために bash と sed を使用した私の試みは失敗しました:

#!/bin/bash
x=1
for fl in myfile; do
    cp $fl $fl.old
    sed 's/\\t \(.*\)/\\t \("${x}"\)/g' $fl.old > $fl.new
    x=$((x+1))
    echo $x
done
4

3 に答える 3

3

これを行う方法を私が知っている最良の方法は、perlのインプレース編集を使用することです。

たとえば、myfile.txtには次のものが含まれます。

\t (obj)
\t (obj)
\t (obj)

インプレース編集を実行します。

perl -i.bak -ne '$a=int(rand()*2000); s/\((.*?)\)/{$1$a}/g; print' myfile.txt

myfile.txtには次のものが含まれています。

\t (obj1869)
\t (obj665)
\t (obj1459)

明らか2000にあなたの要件に合わせてください。

編集:インクリメント識別子を使用する場合は、次を使用します。

perl -i.bak -ne '$a++; s/\((.*?)\)/{$1$a}/g; print' myfile.txt
于 2012-05-09T13:54:58.023 に答える
0

この正規表現を試してください...sedの「拡張された」正規表現を使用します。

sed -r -e "s/\t \((.*)\)/\t \1${x}/g"

ただし、質問が同じファイル内の、、 ...にobj移動するのか、それとも各ファイルが独自のファイルを取得するのか、...obj1obj2obj1obj2

編集どうやらあなたは一行ずつファイルを読む必要があります...このような何かがうまくいくかもしれません。

x=1
while read line; do echo ${line} |  sed -r -e "s/\t \((.*)\)/\t \1${x}/g"; let "x=x+1"; done < myfile.txt > myfile.new.txt

perlもちろん、他の人がやったように使用する方がおそらく簡単です

于 2012-05-09T14:00:28.257 に答える
0
perl -pe 's/(?<=[(])[^)]*/"obj" . ++$count/eg'
于 2012-05-09T13:57:52.470 に答える