Ошибка Sed - неопределенный шаблон замещения - PullRequest
9 голосов
/ 16 февраля 2010

Я нахожусь в каталоге с файлами, состоящими из множества строк, например:

98.684807 :(float)
52.244898 :(float)
46.439909 :(float)

и затем строка, которая заканчивается:

[chuck]: cleaning up...

Я пытаюсь удалить :(float) из каждого файла (но оставить номер), а также удалить строку очистки ....

Я могу получить:

sed -ie 's/ :(float)//g' *

, чтобы работать, но это создает файлы, которые хранят старые файлы. Удаление флага -e приводит к неопределенной ошибке шаблона замены.

То же самое дело с:

sed -ie 's/[chuck]: cleaning up...//g' *

Мысли

Ответы [ 6 ]

13 голосов
/ 16 февраля 2010
sed  -i  ''  -e  's/:(float)//'  -e  '/^.chuck/d'  *

Таким образом, вы говорите sed не сохранять копию (расширение резервной копии нулевой длины до -i) и отдельно указываете команды sed.

3 голосов
/ 16 февраля 2010

ваши номера разделены (float) символом :. Следовательно, вы можете использовать awk / cut для получения своих номеров. Это проще, чем регулярное выражение

$ head -n -1  file | awk -F":" '{print $1}'
98.684807
52.244898
46.439909

$ head -n -1  file | cut -d":" -f1
98.684807
52.244898
46.439909
3 голосов
/ 16 февраля 2010
sed -ie expression [files...]

эквивалентно:

sed -ie -e expression [files...]

и оба означают применять выражение к файлам, перезаписывая файлы, но сохраняя старые файлы с «e» в качестве суффикса резервной копии.

Я думаю, вы хотите: sed -i -e выражение [файлы ...]

Теперь, если вы получаете сообщение об ошибке, должно быть что-то не так с вашим expression.

1 голос
/ 26 декабря 2016

Решение:

sed -i '' 's/ :(float)//g' *

sed -i '' 's/[chuck]: cleaning up...//g' *

Объяснение:

Я могу получить:

sed -ie 's/ :(float)//g' *

для работы, но при этом создаются файлы, в которых хранятся старые файлы.

Это потому, что флаг sed i должен работать таким образом

-i расширение

Редактировать файлы на месте, сохраняя резервные копии с указанным расширением . Если задано расширение нулевой длины , резервная копия не будет сохранена.

В этом случае e интерпретируется как расширение , с которым вы хотите сохранить резервные копии. Таким образом, все ваши исходные файлы будут скопированы с добавлением e к их именам.

Чтобы обеспечить расширение нулевой длины, вам нужно использовать -i ''.

Примечание : В отличие от -i<your extension>, -i'' не будет работать. Вам нужно иметь пробел между -i и '', чтобы он работал.


Снятие флага -e приводит к неопределенной ошибке шаблона замены.

При удалении e сразу после -i, т.е.

sed -i 's/ :(float)//g' *

s/ :(float)//g теперь будет интерпретироваться как аргумент extension для флага i. И первый файл в списке файлов, созданный расширением оболочки *, интерпретируется как sed function (наиболее вероятно, s/regular expression/replacement/flags функция). Вы можете проверить это, проверив вывод

* ** 1079 1080 *

Если вывод приведенной выше цепочки команд 0, наше предположение подтверждается.

Также в этом случае, если каким-то образом первое имя файла квалифицируется как допустимая функция s/regular expression/replacement/flags sed, остальные имена файлов будут интерпретироваться как обычные файлы для работы с sed.

1 голос
/ 16 февраля 2010

Проверьте, есть ли в каталоге какие-либо нечетные имена файлов.

Вот один из способов дублировать вашу ошибку:

$ touch -- "-e s:x:"
$ ls
-e s:x:
$ sed -i "s/ :(float)//g' *
sed: -e expression #1, char 5: unterminated `s' command

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

$ sed -i "s/ :(float)//g' -- *

Вы можете сделать то же самое, чтобы удалить файл:

$ rm "-e s:x:"
rm: invalid option -- 'e'
$ rm -- "-e s:x:"
1 голос
/ 16 февраля 2010
sed -i -e 's/ :(float)//g' *
...