Манипулировать амперсандом в седе - PullRequest
3 голосов
/ 22 июля 2011

Можно ли манипулировать амперсандом в седе?Я хочу добавить +1 ко всем числам в файле.Примерно так:

sed -i "s/[0-9]\{1,2\}/$(expr & + 1)/g" filename

РЕДАКТИРОВАТЬ: Сегодня я создал цикл с использованием grep и sed, который выполняет необходимую работу.Но вопрос остается открытым, если кто-нибудь знает способ манипулирования амперсандом, так как это не первый раз, когда я хотел запускать команды для строки замены, и не смог .

Ответы [ 3 ]

2 голосов
/ 22 июля 2011

Вы можете использовать модификатор e для достижения этой цели:

$ cat test.txt
1
2
$ sed 's/^[0-9]\{1,2\}$/expr & + 1/e' test.txt
2
3

В этом случае вы должны построить команду в заменяющей части, которая будет выполнена и результат будет использован для замены.

1 голос
/ 22 июля 2011

Отличный вопрос. smci ответил первым и был на месте о снарядах.

Если вы хотите решить эту проблему в целом, вот (для забавы) решение Ruby, встроенное в пример:

echo "hdf 4 fs 88\n5 22 sdf lsd 6" | ruby -e 'ARGF.each {|line| puts line.gsub(/(\d+)/) {|n| n.to_i+1}}'

Выход должен быть

hdf 5 fs 89\n6 23 sdf lsd 7
1 голос
/ 22 июля 2011
Для этого

sed потребуется выполнить команду оболочки (с '!') В строке в каждой строке .

Здесь вы думаете, что вызываете sed, который затем перезванивает в оболочку для оценки $(expr & + 1) для каждой строки, но на самом деле это не так. $(expr & + 1) просто будет статически оценен (один раз) внешней оболочкой и вызовет ошибку, так как '&' не является в этой точке числом.

Чтобы на самом деле сделать это, либо:

  1. жестко закодировать все десять регистров с последней цифрой 0..9, согласно этому примеру в документации sed

  2. Используйте команду sed, которая начинается с '1, $!' , чтобы вызвать оболочку в каждой строке и выполнить там приращение с помощью expr, awk, perl или чего-либо другого.

  3. СНОСКА: я никогда не знал о модификаторе / e , который показывает php-кодер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...