Как применить функцию к \ 1 в sed? - PullRequest
1 голос
/ 06 августа 2011

Как применить функцию к запоминаемому числовому шаблону в sed?

Упрощение проблемы, как показано ниже:

file.txt:

130 Some string here
40  Some string here
19  Some string here

script.sh:

#!/bin/bash

function tenmore
{
expr $1 + 10
}

sed -i.backup "s|^\([0-9][0-9]*\)\t\(.*\)|\2\t`tenmore \1`|g" file.txt 

wantedoutput:

Some string here    140
Some string here    50
Some string here    29

что я на самом деле получаю:

Some string here    11
Some string here    11
Some string here    11

Итак, он интерпретирует \ 1 как выходсимвол 1 и выполняет функцию более 1 (1 + 10 = 11), а не над числовым значением, хранящимся в \ 1.Как я могу применить функции к \ 1?

Спасибо.

Ответы [ 3 ]

1 голос
/ 06 августа 2011

awk - правильный инструмент для этого:

( echo -e "130\tSome string here";
echo -e "40\tSome string here";
echo -e "19\tSome string here" ) | awk -F "\t" '{print $2 "\t" $1+10}'
1 голос
/ 06 августа 2011

Вы не можете. Обратное расширение происходит в оболочке еще до запуска программы sed, поэтому он не может знать, что \ 1 будет иметь особое значение для sed.

Подобные вещи хорошо подходят для перехода от sed к более сильному инструменту, такому как Perl:

perl -p -i.backup -e 's/^([0-9][0-9]*)\t(.*)/"$2\t".($1+10)/e'

или даже

perl -p -i.backup -e 's/^(\d+)\t(.*)/"$2\t".($1+10)/e'

(Модификатор / g не имеет смысла, когда ваше регулярное выражение совпадает только в начале строки)

0 голосов
/ 06 августа 2011

Если вы не хотите использовать awk или не хотите переписывать свою функцию bash:

( echo -e "130\tSome string here";
echo -e "40\tSome string here";
echo -e "19\tSome string here" ) | while read v1 v2; do echo -e "$v2\t$(tenmore $v1)"; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...