использование подстановки команд внутри скрипта sed с аргументами - PullRequest
4 голосов
/ 15 июня 2011

Я пытаюсь написать короткий сценарий, в котором я использую sed для поиска в потоке, а затем выполняю подстановку в потоке на основе результатов функции оболочки, которая требует аргументы от sed, например,

#!/bin/sh

function test {
    echo "running test"
    echo $1
    }

sed -n -e "s/.*\(00\).*/$(test)/p" < testfile.txt

, где testfile.txt содержит:

1234
2345
3006
4567

(с символами новой строки между ними; они удаляются при форматировании ваших сайтов).Итак, хорошо, что сценарий работает для меня (вывод «бегущий тест»), но, очевидно, не имеет аргументов, переданных для тестирования.Мне бы хотелось, чтобы строка sed была чем-то вроде:

sed -n -e "s/.*\(00\).*/$(test \1)/p" < testfile.txt

и выводом:

running test
00

, чтобы шаблон, соответствующий sed, подавался в качестве аргумента для проверки.Я не ожидал, что вышесказанное сработает, но я попробовал каждую комбинацию скобок, обратных кавычек и экранировок, которую только мог придумать, и нигде не могу найти упоминания об этой ситуации.Помощь

Ответы [ 3 ]

1 голос
/ 15 июня 2011

Сед не будет выполнять команды. Perl, однако, с опцией /e в команде regex.

perl -pe 'sub testit { print STDERR "running test"; return @_[0]; }; s/.*(00).*/testit($1)/e' <testfile.txt

Перенаправьте stderr в / dev / null, если вы не хотите видеть его в строке и испортить вывод.

1 голос
/ 16 января 2012

Это может работать для вас:

tester () { echo "running test"; echo $1; }
export -f tester
echo -e "1234\n2345\n3006\n4567" |
sed -n 's/.*\(00\).*/echo "$(tester \1)"/p' | sh
running test
00

Или, если вы используете GNU sed:

echo -e "1234\n2345\n3006\n4567" |
sed -n 's/.*\(00\).*/echo "$(tester \1)"/ep'
running test
00

N.B. Не забудьте сначала экспортировать функцию.

0 голосов
/ 15 июня 2011

попробуйте это:

sed -n -e "s/.*\(00\).*/$1$2/p" testfile.txt | sh

Примечание: у меня может быть неправильное выражение, но важный бит - это связь с оболочкой (sh)

...