2012-05-28 5 views
2

Im пытается заменить номера в текстовом файле, добавив один к ним. т.е.sed regex с переменными для замены чисел в файле

sed 's/3/4/g' path.txt 
sed 's/2/3/g' path.txt 
sed 's/1/2/g' path.txt 

Вместо этого, Могу ли я автоматизировать его, то есть найти/d и добавьте к нему в замене.

Что-то вроде

sed 's/\([0-8]\)/\1+1/g' path.txt 

Также хотел захватить более одной цифры т.е. ([0-9])\t([0-9]) и изменить каждый держа вкладку между ними

Благодарности

отредактирован # 2 Использование PERL пример, Я также хотел бы, чтобы он работал с большим количеством цифр, т.е.

perl -pi~ -e 's/(\d+)\.(\d+)\.(\d+)\.(\d+)/ ($1+1)\.($2+1)\.($3+1)\.($4+1) /ge' output.txt 

Любые советы по созданию вышеуказанных работ?

+0

И когда вы нажмете 9? Как насчет двузначных чисел? –

+0

Ваше право! он должен быть [0-8], поэтому он не набирает двойные цифры. – user370507

ответ

0

Вы не можете сделать дополнение непосредственно в sed - вы можете сделать это в awk путем сопоставления чисел с использованием регулярного выражения в каждой строке и увеличения значения, но это довольно сложно. Если не нужно обрабатывать произвольные числа, но ограниченный набор, как только однозначных числа от 0 до 8, вы можете просто положить команды несколько замены на одной sed командной строки, разделяя их точкой с запятой:

sed 's/8/9/g ; s/7/8/g; s/6/7/g; s/5/6/g; s/4/5/g; s/3/4/g; s/2/3/g; s/1/2/g; s/0/1/g' path.txt 
6

Нет поддержки арифметики в sed, но вы можете легко сделать это в Perl.

perl -pe 's/(\d+)/ $1+1 /ge' 

С опцией /e, замещающее выражение должно быть действительным кодом Perl. Таким образом, чтобы обрабатывать окончательный обновленный пример, вам нужно

perl -pi~ -e 's/(\d+)\.(\d+)\.(\d+)\.(\d+)/ $1+1 . "." $2+1 . "." . $3+1 . "." . $4+1 /ge' 

где строка цитироваться и смежные строки соединяются вместе с Perl оператором конкатенации .. (Арифметические числа также привязаны к строкам, когда они объединены со строкой.)

... Хотя, конечно, первый скрипт уже делает это более элегантно, поскольку с флагом /g он уже увеличивает каждую последовательность цифры с одним, в любом месте строки.

+2

На самом деле Perl может делать редактирование на месте, поэтому 'perl -pi ~ -e 's/(\ d +)/1 + $ 1/ge' * .txt' – tripleee

+0

@goldilocks: На самом деле ваш код цикла неверен в нескольких местах; но в соответствии с моим последним комментарием, не так много смысла в его исправлении. – tripleee

+0

«Неверно» в том смысле, что он проходит через все .txt-файлы и выполняет подстановку правильно? ; | – delicateLatticeworkFever

1

Вы можете сделать это с помощью sed, но это непросто, см. this thread.

И с awk тоже сложно, see this.

Я предпочел бы использовать perl для этого (something like this can be seen in action @ ideone):

perl -pe 's/([0-8])/$1+1/e' 

(Пример ideone.com должен иметь какой-то цикл, как ideone не устанавливает -pe по умолчанию.) PERL решение

2

Triplee в является более общим ответом, но решение Michal's sed хорошо подходит для этого конкретного случая.Однако СЕПГ решение Michal является более легко написано:

sed y/12345678/23456789/ path.txt 

и лучше реализована как

tr 12345678 23456789 < path.txt 

Это совершенно не в состоянии справиться с 2-значные номера (как в отредактированной вопрос).

0

Это может работать для вас (GNU СЭД & Bash):

sed 's/[0-9]/$((&+1))/g;s/.*/echo "&"/e' file 

Это добавит к каждой отдельной цифры, для увеличения числа:

sed 's/[0-9]\+/$((&+1))/g;s/.*/echo "&"/e' file 

нотабене Этот метод чреват проблемами и может привести к неожиданным результатам.

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