Как перейти от многострочной команды sed в командной строке к одной строке в скрипте - PullRequest
1 голос
/ 13 августа 2010

Я выполнил sed со следующим аргументом, если я скопировал и вставил это в открытую оболочку:

cat test.txt | sed '/[,0-9]\{0,\}[0-9]\{1,\}[acd][0-9]\{1,\}[,0-9]\{0,\}/{N
s/[,0-9]\{0,\}[0-9]\{1,\}[acd][0-9]\{1,\}[,0-9]\{0,\}\n\-\-\-//}'

Проблема в том, что когда я пытаюсь переместить это в скрипт KornShell (ksh),ksh выдает ошибки из-за того, что я считаю символом новой строки.Кто-нибудь может мне помочь с этим?К вашему сведению: регулярное выражение должно быть заменой нескольких строк.

Спасибо!

Ответы [ 4 ]

1 голос
/ 13 августа 2010

Это: \{0,\} можно заменить на это: *

Это: \{1,\} можно заменить следующим: \+

Нет необходимости избегать дефисов.

Новая строка может быть заменена на -e (или точкой с запятой)

cat можно заменить, используя имя файла в качестве аргумента для sed

Результат:

sed -e '/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*/{N' -e 's/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*\n---//}' test.txt

или

sed '/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*/{N;s/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*\n---//}' test.txt

(непроверенные)

0 голосов
/ 13 августа 2010

Korn Shell - в отличие от C Shell - не имеет проблем с переводом строк. Таким образом, новая строка вряд ли станет вашей проблемой. Те же комментарии относятся к оболочкам Bourne и POSIX, а также к Bash. Я скопировал ваш пример и без проблем запустил его в Linux под оболочкой Bash и Korn.

Если вы используете C Shell для своей работы, вы уверены, что используете 'ksh ./script', а не './script'?

В противном случае есть другая проблема - где-то несбалансированная цитата, возможно.

Проверьте опции '-v' и '-n', а также опцию '-x' для оболочки Korn. Это может рассказать вам больше о том, где проблема.

0 голосов
/ 13 августа 2010

Можете ли вы попробовать заменить символ новой строки на `echo -e \\ r`

0 голосов
/ 13 августа 2010

Вы можете попробовать поместить свое регулярное выражение в файл и вызвать sed с параметром -f?

cat test.txt | sed -f file.sed
...