我有一个带有这种模式的文本文件:
\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
答案 0 :(得分:3)
我知道如何执行此操作的最佳方式是使用perl就地编辑:
E.g。 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
答案 1 :(得分:0)
perl -pe 's/(?<=[(])[^)]*/"obj" . ++$count/eg'
答案 2 :(得分: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
可能比其他人做的更简单