Bash.Заменить на седь.Проблема конца строки - PullRequest
1 голос
/ 23 мая 2019

Я пытаюсь найти и заменить файл, используя sed.Но sed, кажется, ненавидит специальный символ конца строки.

text=$(shuf text.txt)
echo "This is text:
$text"
sed -i "s~%text%~$text~g" t.txt

Вот что я получаю:

This is text:
 line 2
 line 1
 line 3
 line 4
sed: -e expression #1, char 15: unterminated `s' command

Я пытался заменить \ n на \ r, но результат неудовлетворяющий вообще.Существует возможность сделать tr '\ n', '$' , а затем сделать это в обратном порядке, но это не кажется правильным.

Справка?

1 Ответ

3 голосов
/ 23 мая 2019

Использование sed и bash

Поскольку вы используете bash, попробуйте:

sed -i "s~%text%~${text//$'\n'/\\n}~g" t.txt

${text//$'\n'/\\n} является примером замены шаблона в bash . В этом случае он заменяет все символы новой строки на обратную косую черту, за которой следует n, которую sed будет интерпретировать как новую строку.

Пример

Рассмотрим эту text переменную:

$ echo "$text"
line 2
 line 1
 line 3
 line 4

И этот входной файл:

$ cat t.txt
start
%text%
end

Теперь запустите нашу команду:

$ sed "s~%text%~${text//$'\n'/\\n}~g" t.txt
start
line 2
 line 1
 line 3
 line 4
end

Чтобы изменить файл на месте, конечно, добавьте обратно -i.

Использование awk

С такой же переменной text и файлом t.txt, как указано выше:

$ awk -v new="$text" '{gsub(/%text%/, new)} 1' t.txt
start
line 2
 line 1
 line 3
 line 4
end
...