2016-02-17 2 views
0

У меня есть простой BSD SED (не GNU). Это то, что я бегу. Он не работает в последней команде sed. Ошибки: строка длиннее 8 символов; и Label N недействителен или что-то в этом роде. Это не весь код - только часть, которая не:BSD `sed`: запуск нескольких команд` sed` изнутри оболочки: заменить N-е вхождение

set -x 
     chg() 
     { 
     file=$1 

sed ":1 
N 
$!b1 
s/)/,col1)/5 " $file > tmp && mv tmp $file 
} 

chg $f 

sed: 0602-404 Function N cannot be parsed for both above and below 

Я попытался

set -x 
     chg() 
     { 
     file=$1 

sed ': 1 \ 
N \ 
$!b1 \ 
s/)/,col1)/5' $file > tmp && mv tmp $file 
} 

chg $f 

Та же команда будет работать в командной строке

sed ': 1 <enter> 
N <enter> etc 

Как я исправить это ? Я хочу пятое появление ) быть заменен ,col),

sed -e $':x\nN;$!bx\ns/)/,col1)/5' 


спасибо. Выше 1 лайнер не работает
по какой-то причине последний бит /5 на СЭД на лайнеры никогда не работают для меня на AIX
Input

#more sdat 
) from (d , bd , c , d blah 
someblah, blah) as 
somebla, lah) 
as 
(some other pos) 
dada 

Выход

sed -e ':x' -e 'N;$!bx' -e 's/)/,col1)/5' sdat 

) from (d , bd , c , d blah 
someblah, blah) as 
somebla, lah) 
as 
(some other pos) 
dada 

<br> 
+0

Выполняет ли ваш скрипт то же 'sed', что и в командной строке? Каков результат из 'set -x'? Что такое * точное сообщение об ошибке? – tripleee

+0

Тангенциально вы должны использовать двойные кавычки вокруг любой переменной, которая содержит имя файла. – tripleee

+0

Также между двоеточием и меткой не допускаются пробелы. Это должно быть ': 1' вместо': 1'. Другой проблемой может быть пространство, которое вы помещаете перед каждой строкой в ​​первом примере. –

ответ

2

Я тестировал успешно следующее :

function chg { 
    sed ':x 
N 
$!bx 
s/)/,col1)/5 ' 
} 

Обратите внимание, что я заменил ваши двойные кавычки одиночными кавычками , и ваш ярлык 1 с x. Кроме того, обратите внимание, что после bx не допускается свободное пространство.

С помощью этого скрипта следующий ввод производит вывод показан ниже:

(a)(b) 
(c) (d) (e) (f) (g) 

Выход:

(a)(b) 
(c) (d) (e,col1) (f) (g) 

В sed использованный:

man sed | tail -n 1 
BSD        May 10, 2005        BSD 

P.S. В bash команда sed может быть превращена в однострочный, который работает с BSD sed следующим образом:

sed -e $':x\nN;$!bx\ns/)/,col1)/5' 
+0

Хороший материал.Обратите внимание, что вы можете использовать однострочное без bash, убедившись, что ваши метки находятся в конце их собственной командной строки. 'sed -e ': x' -e 'N; $! bx' -e 's /) /, col1)/5'' – ghoti

+0

@ghoti - Хорошая точка. Я думаю, что это еще больше подрывает сделанное выше утверждение: «Правильное решение НЕ будет в sed». Как вы думаете? – peak

+0

Эмм ... Боюсь, вы не можете напасть на меня, чтобы не согласиться с Эд Мортоном. : -D Решение на основе решения sed * работает *, и оно может быть * достаточно хорошим *, но ... «правильно»? Нет. Правильное решение - это всегда тот, который понимает * формат * входных данных и меняет его в соответствии со своей структурой, и sed не может этого сделать. Тем не менее, «достаточно хорошо» часто ... достаточно хорошо. – ghoti

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