Почему awk
? для этого? grep -EPo '[^\s]+\.h[\s]' /path/to/src/*.cpp >> Makefile
должно помочь.
sed: -e expression #1, char 2: unterminated `s' command
В сообщении об ошибке говорится, что ошибка происходит на втором символе, что кажется любопытным. Я могу воспроизвести это, поставив новую строку в начале первой переменной:
$ a=$'\nfoo'
$ b='bar'
$ sed "s@$a@$b@"
sed: -e expression #1, char 2: unterminated `s' command
Новая строка без символов завершает команду sed. Если поставить новую строку позже в a
, то, конечно, ошибка возникнет на более позднем символе.
Вы вывели обе переменные ранее в сценарии, но они не были заключены в кавычки, поэтому любые пробелы в них должны были быть удалены, а пробелы в середине отобразились бы как одиночные пробелы.
Проверьте, что на самом деле содержат ваши переменные, с помощью чего-то вроде этого:
printf ">%s<\n" "$to_replace"
printf "%q\n" "$to_replace"
Последнее - это функция Bash, которая отображает строку в кавычках таким образом, что Bash принимает ее в качестве ввода. set -x
также покажет, что поступает в командную строку sed, но вам нужно будет заметить литеральную новую строку из его вывода.
Итак, если одна ведущая новая строка - это все, что есть, вы можете удалить ее в начале сценария:
to_replace=${pc#*,}
to_replace=${to_replace#$'\n'}
(Можно объединить их в один, но отдельные шаги работают, даже если новой строки там нет)
.Попробуйте это
sed -i -e "s@$to_replace@$replace_with@g" "$entry"
где
-i
означает замену "на месте", Если вы не используете -i
, замена будет на стандартном выводе.