Я нахожусь в каталоге с файлами, состоящими из многих строк строк как это:
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' *
Мысли?
Ваши числа разделены (float)
символом :
. Поэтому для получения чисел можно использовать awk/cut. Это проще, чем regex
$ 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
sed -ie expression [files...]
эквивалентно
sed -ie -e expression [files...]
и оба означают применение выражения к файлам, перезаписывая файлы, но сохраняя старые файлы с «e» в качестве суффикса резервного копирования.
Я думаю, вы хотите: sed -i -e expression [файлы...]
Теперь, если вы получаете ошибку, что должно быть что-то не так с вашим выражением
.
Проверьте, нет ли у вас странных имен файлов в каталоге.
Вот один из способов продублировать вашу ошибку:
$ 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:"
sed -i '' -e 's/:(float)//' -e '/^.chuck/d' *
Таким образом, вы говорите sed не сохранять копию (резервное расширение нулевой длины до -i
) и отдельно указываете команды sed.