sed «$» не действует как символ конца строки

Использование Ubuntu 18 с оболочкой bash.

Символ «$» не ведет себя должным образом для соответствия конца строки в sed.

Когда я пытаюсь:

sed '/^>/ s/$/_new/g' <file>

это должно привести к

>sometext_new

, но я получаю

_newetext

Это может быть связано с этим вопросом: Ошибка при сопоставлении конца строки с $ в команде Sed , но при этом использовался csh и имел назначения переменных, которых у меня нет.

Я попытался отключить расширение оболочки set -f ;, но это не помогло

Я попытался sed '/^>/ s/"$"/_new/g' <file>

, чтобы это превратило $ в буквальный символ, что не приводит к подстановке

]

Буду признателен за любую помощь в восстановлении предыдущего поведения $ как символа конца строки в sed

1
задан 5 September 2019 в 14:24

1 ответ

Ваш <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 модификатор не имеет никакого эффекта, когда замена привязывается в конец (или запускаются) шаблона.

2
ответ дан 7 December 2019 в 13:14

Другие вопросы по тегам:

Похожие вопросы: