Я публикую это как новый ответ, потому что совершенно уверен, что это правильное «решение» вашей проблемы.
К сожалению, если вы ищете пакет в поиске пакетов Redhats, (требуется учетная запись RedHat)
Вы увидите, что пакет screen НЕ доступен в репозитории rhel -7 -desktop -rpm. Этот пакет доступен только в следующих репозиториях:
По сути, у вас неправильная подписка, содержащая пакет экрана.
Это кажется абсурдным, учитывая, что screen — невероятно важный пакет, который часто требуется установить на все машины.
Эти различия должны быть более очевидными при выборе между подпиской на рабочий стол и рабочую станцию, поскольку они не интуитивно понятны. Я сталкивался с этой проблемой раньше, и это одна из моих самых больших проблем с RedHat.
Лучше поместить команды Sed в файл, чтобы оболочка не пыталась интерпретировать специальные символы строки (want -be ).
longline.sed
:
/^[[:space:]]*number_of_cars_are=/a\
numbers=` su hdfs -c "hdfs dfs -ls $var/*.jar" |sed s'/\\// /g' | awk '{print $NF}' | wc -m `
Обратите внимание, что единственной модификацией является экранирование обратной косой черты, потому что Sed интерпретирует экранированные символы.
$ sed -f longline.sed newfile
more /tmp/orig_file
number_of_cars_are=$number_of_cars_are
numbers=` su hdfs -c "hdfs dfs -ls $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `
В этом сценарии мы можем использовать функцию heredoc
<<
.
repl=$(cat - <<\eof |\
sed -e 's:[\&/]:\\&:g'
numbers=` su hdfs -c "hdfs dfs -ls $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `
eof
)
$ sed \
-e '/^[[:blank:]]*number_of_cars_are=/G' \
-e "s/\\n/&$repl/" \
/tmp/orig_file
В качестве первого шага используйте heredoc для печати строки, которую вы хотите добавить, и обработайте ее, чтобы экранировать символы RHS s///, и сохраните ее в переменной repl.
Затем мы подключаем его к секции s/// rhs на выбранной линии.
Обратите внимание, что этот метод в высшей степени Posixly и не требует никаких файлов. Он предполагает использование uniline repl.
Основная проблема заключается в том, что строка в одинарных кавычках не может содержать ни одной кавычки. Чтобы предоставить вставленную строку в командной строке, вам нужно будет выйти из строки, заключенной в одинарные кавычки, добавить одинарную кавычку, а затем продолжить строку. Таким образом, каждая одинарная кавычка будет записана либо как '\''
, либо как '"'"'
, где две фланкирующие одинарные кавычки заканчивают и начинают, соответственно, строку в одинарных кавычках до и после одинарной кавычки.
Чтобы избежать необходимости принимать дополнительные меры предосторожности, вы можете вместо этого указать строку, которую хотите вставить в документ как текст.
Аналогично ответу Квазимодо , но с использованием цитируемого здесь -документа, возможно, непосредственно из командной строки:
sed -f /dev/stdin file <<'END_SED'
/^number_of_cars_are/a\
numbers=` su hdfs -c "hdfs dfs -ls $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `
END_SED
Так как здесь -документ цитируется (, обозначенным одинарными кавычками вокруг начального END_SED
разделителя ), ни одно из расширений в нем не будет расширено оболочкой.
Утилита sed
считывает документ здесь -со своего стандартного ввода, используя -f /dev/stdin
.