sed + как добавить сложную строку после соответствующей строки

Я публикую это как новый ответ, потому что совершенно уверен, что это правильное «решение» вашей проблемы.

К сожалению, если вы ищете пакет в поиске пакетов Redhats, (требуется учетная запись RedHat)

Вы увидите, что пакет screen НЕ доступен в репозитории rhel -7 -desktop -rpm. Этот пакет доступен только в следующих репозиториях:

  • rhel -7 -сервер -об/мин
  • rhel -7 -сервер -eus -об/мин
  • rhel -7 -рабочая станция -об/мин

По сути, у вас неправильная подписка, содержащая пакет экрана.

Это кажется абсурдным, учитывая, что screen — невероятно важный пакет, который часто требуется установить на все машины.

Эти различия должны быть более очевидными при выборе между подпиской на рабочий стол и рабочую станцию, поскольку они не интуитивно понятны. Я сталкивался с этой проблемой раньше, и это одна из моих самых больших проблем с RedHat.

0
26.09.2020, 10:10
3 ответа

Лучше поместить команды 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 `
1
18.03.2021, 23:03

В этом сценарии мы можем использовать функцию 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.

0
18.03.2021, 23:03

Основная проблема заключается в том, что строка в одинарных кавычках не может содержать ни одной кавычки. Чтобы предоставить вставленную строку в командной строке, вам нужно будет выйти из строки, заключенной в одинарные кавычки, добавить одинарную кавычку, а затем продолжить строку. Таким образом, каждая одинарная кавычка будет записана либо как '\'', либо как '"'"', где две фланкирующие одинарные кавычки заканчивают и начинают, соответственно, строку в одинарных кавычках до и после одинарной кавычки.

Чтобы избежать необходимости принимать дополнительные меры предосторожности, вы можете вместо этого указать строку, которую хотите вставить в документ как текст.

Аналогично ответу Квазимодо , но с использованием цитируемого здесь -документа, возможно, непосредственно из командной строки:

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.

0
18.03.2021, 23:03

Теги

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