Как вставить многострочный текст, который является o/p из команды, в начало файла?

readline— это библиотека, которая используется bashи некоторыми другими программами, но не tcsh. По историческим причинам tcshимеет свою собственную реализацию функции readline -, чей набор функций не обязательно совпадает с -для -с readline. Таким образом, попытка установить переменные readline для tcsh бесплодна, так как они не имеют ничего общего друг с другом.

Ближайшим эквивалентом readline visible-statsв tcshявляется переменная оболочки addsuffix, и она уже должна быть установлена ​​по умолчанию.

tcsh bindkeyявляется встроенной оболочкой tcsh, поэтому вы найдете ее описание в man tcshв разделе Встроенные команды . addsuffixтакже описан на той же справочной странице в разделе Специальные переменные оболочки .

0
19.02.2020, 11:33
5 ответов

Один из способов с использованием ed(1), который должен работать как с вариантами GNU, так и с BSD.

printf '%s\n' '0a' "$(figlet -f slant "p r o f i l e" | sed -n 's/^.*/#&/p')" "". w | ed -s ~/.profile
  • printf '%s\n'То же, что и echo, но более универсальный.
  • "$( )"называется подстановкой команд, которая захватывает вывод команды. Обратите внимание, что он заключен в двойные кавычки по какой-то причине.
  • 0— это адрес или номер строки в буфере/файле, который является первой строкой, хотя 1iтоже должен работать, но я предпочитаю 0a, так как 1iне работает с пустыми файлами
  • a— это команда, которая означает добавление или добавление,.
  • ""просто создать пустую/новую строку после выводаfiglet
  • .Сообщает Эду, что мы закончили редактирование.
  • wозначает запись.
  • Затем трубопровод |-ed
  • С флагом -s, что означает молчание.
2
28.04.2021, 23:23

С GNU sed можно идти до конца:

sed -i '1{H;s/.*/figlet -f slant "p r o f i l e"/e;s/^/#/mg;G}' ~/.profile

Обратите внимание на модификатор eдля первой команды s, которая выполняет пространство шаблонов, команду figlet, которую я создаю.

2
28.04.2021, 23:23

Альтернативный вариант использования ex(1), vi/ vim, эквивалентныйed:

ex ~/.profile <<EOF
0r !figlet -f slant "p r o f i l e" | sed 's/^/\#/'
w
EOF

Вставляет результаты конвейера figlet перед первой строкой файла и сохраняет их.

3
28.04.2021, 23:23

Попробуйте (не проверено)

figlet -f slant "p r o f i l e" | sed -n 's/^.*/#&/p' | cat -.profile
-1
28.04.2021, 23:23

Поскольку вы уже используете sed, вы можете сделать это с помощью пары простых вызовов sed:

figlet -f slant "p r o f i l e" | sed 's/^./#&/' | sed '' - file

Последний вызов sed объединяет стандартный ввод(-)и файл (без изменений ).

Конечно, это можно сделать одним вызовом awk:

figlet -f slant "p r o f i l e" | awk 'NR==FNR{gsub(/^/,"#")}1' - file

Или, если хотите ed, вы можете сделать:

echo 'r !figlet -f slant "p r o f i l e"
,s/^/#/
r file
w
Q' | ed -s

Хммм, вы хотели один -вкладыш:

printf '%s\n' 'r !figlet -f slant "p r o f i l e"',s/^/#/ 'r file' w Q| ed -s

Значит:

printf '%s\n'                           # print each argument on one line.
'r !figlet -f slant "p r o f i l e"'    # read the output of a sh command.
,s/^/#/                                 # insert a # at each line start.
'r file'                                # read the file
w                                       # write (the file)
Q                                       # Quit
|                                       # pipe the commands to the ed call
ed -s                                   # call ed in silent mode.
0
28.04.2021, 23:23

Теги

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