Использование Ubuntu 18 с оболочкой bash.
Символ «$» не ведет себя должным образом для соответствия конца строки в sed.
Когда я пытаюсь:
sed '/^>/ s/$/_new/g' <file>
это должно привести к
>sometext_new
, но я получаю
_newetext
Это может быть связано с этим вопросом: Ошибка при сопоставлении конца строки с $ в команде Sed , но при этом использовался csh и имел назначения переменных, которых у меня нет.
Я попытался отключить расширение оболочки set -f ;
, но это не помогло
Я попытался sed '/^>/ s/"$"/_new/g' <file>
, чтобы это превратило $ в буквальный символ, что не приводит к подстановке
]Буду признателен за любую помощь в восстановлении предыдущего поведения $ как символа конца строки в sed
Ваш <file>
почти наверняка имеет стиль Windows (CRLF) окончания строки:
$ printf '>sometext\n' | sed '/^>/ s/$/_new/'
>sometext_new
, но
$ printf '>sometext\r\n' | sed '/^>/ s/$/_new/'
_newetext
<час> , Если Вы хотите сохранить окончания строки CRLF, но текст замены в (Windows) EOL, Вы могли использовать s/\r$/_new\r/
напр. (передающий по каналу к cat -A
для создания окончания строки явными)
$ printf '>sometext\r\n' | sed '/^>/ s/\r$/_new\r/' | cat -A
>sometext_new^M$
OTOH, если Вы хотите преобразовать целый файл в окончания Unix, Вы могли бы использовать
sed -e 's/\r$//' -e '/^>/ s/$/_new/'
или преобразовать файл с dos2unix
перед использованием sed
.
Примечание, что g
модификатор не имеет никакого эффекта, когда замена привязывается в конец (или запускаются) шаблона.