2012-05-09 2 views
3

У меня есть текстовый файл с таким рисунком:Замена шаблона в текстовый файл со случайным значением

\t (hello world) 

Мне нужно заменить текст в скобках с уникальным значением (например, ob1, obj2 и т.д.) таким образом, что

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

становится ...

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

Или что-нибудь еще, что является уникальным. Решение, использующее любой инструмент, работающий в cygwin, будет работать. Моя попытка с помощью Баша и СЭД, чтобы сделать это не удалась:

#!/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 

ответ

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 вашим требованиям.

EDIT: Если вы хотите использовать увеличивающиеся идентификаторы применения:

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

+1 моя мысль была использовать Perl тоже. Одним из требований является уникальность, поэтому необходимо отслеживать используемые идентификаторы. Простое использование счетчика. –

+0

Это простое изменение, см. Мое редактирование. – Benj

+0

Это не похоже на изменение содержимого файла (без ошибок). Я не знаю perl, и даже я могу следить за тем, что здесь происходит. Я использую Cygwin. Есть ли какие-либо символы в этом заявлении, которые, возможно, должны избегать? – Scribblemacher

0
perl -pe 's/(?<=[(])[^)]*/"obj" . ++$count/eg' 
0

Попробуйте это регулярное выражение ... Он использует СЕПГ "расширенные" регулярные выражения.

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

Однако, я не уверен, если ваш вопрос хочет obj пойти в obj1, obj2 ... в том же файле, или если каждый файл получает свой собственный уникальный obj1, obj2 ...

EDIT По-видимому, вам нужно прочитать файл по строкам ... что-то вроде этого может работать.

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 как другие сделали

+0

Каждый идентификатор должен быть уникальным в файле. – Scribblemacher

 Смежные вопросы

  • Нет связанных вопросов^_^