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
perl -pe 's/(?<=[(])[^)]*/"obj" . ++$count/eg'
于 2012-05-09T13:57:52.470 回答
0

试试这个正则表达式...它使用 sed 的“扩展”正则表达式。

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

但是,我不确定您的问题是要obj转到obj1, obj2, ... 在同一个文件中,还是每个文件都有自己独特的obj1, obj2...

编辑显然你需要逐行读取文件......这样的事情可能会奏效。

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 回答