сложный текст заменить из командной строки - PullRequest
1 голос
/ 18 ноября 2010

Упрощенный пример того, что я хочу сделать:

У меня есть файл: input.txt, который выглядит как

a 2 4 b
a 3 8 b
c 9 4 d
a 3 4 8 b

и скрипт: add.sh, который принимает команду-Параметры строки и возвращает их сумму

Я хочу найти input.txt для всех экземпляров шаблона 'a (.*) b', где я передаю часть (. *) в качестве параметра командной строки для add.sh.

Например, я хочу сделать что-то вроде sed 's/a \(.*\) b/a {add.sh \1} b/g' input.txt (это, конечно, не работает).Таким образом, результат должен выглядеть следующим образом:

a 6 b
a 11 b
c 9 4 d
a 15 b

Какой самый простой способ сделать это?

Спасибо

Ответы [ 3 ]

0 голосов
/ 18 ноября 2010

И если Perl не вариант, вы могли бы Сценарий это примерно так:

grep -e '^a .* b$' input.txt | sed -e 's/a \(.*\) b/\1/g' | while read LINE; do ./add.sh $LINE; done

Я понял, что вышесказанное не решает твою проблему, я просто сосредоточился на твоем выражении sed

Однако, если вы заинтересованы в решении этой проблемы с помощью другого сценария оболочки, он, вероятно, будет выглядеть примерно так:

cat input.txt | while read LINE; do
    if [[ "$LINE" =~ ^a (.*) b$ ]]; then
        echo -n "a "
        add.sh ${BASH_REMATCH[1]}
        echo " b"
    else
        echo $LINE
    fi
done
0 голосов
/ 18 ноября 2010

Если add.sh:

#!/bin/sh
arg1=$1
nums=$2
shift 2
for i in $nums
do
    sum=$((sum+i))
done
echo "$arg1 $sum $@"

тогда вы могли бы сделать:

sed 's/^\([^ ]* \)\(.*\)\( [^ ]*\)$/\1\"\2\"\3/' input.txt | xargs -L 1 ./add.sh

, который добавил бы числа в каждой строке. Чтобы добавить их только для строк, которые начинаются с «a» и заканчиваются на «b», используйте это:

sed 's/^a \(.*\) b$/a \"\1\" b/' input.txt | xargs -L 1 ./add.sh

Строка "c 9 4 d" по-прежнему обрабатывается add.sh, но команда sed не добавляет кавычки, поэтому сценарий видит только "9" как $2, поэтому сумма только выполняется один раз с результатом как «9». «4» рассматривается как часть оставшейся части $@.

0 голосов
/ 18 ноября 2010
perl -pe 's/a (.*) b/"a ".`add.sh $1`." b"/eg' input.txt

Просто убедитесь, что add.sh не выводит символ новой строки.

...