С помощью awk
:
awk '{if($0=="click"){getline n;printf "%s(%s)\n", $0, n}else{print}}' file
Если строка соответствует щелкните
, загрузите следующую строку в переменную с именем n
, а затем распечатайте требуемый формат вывода.
Edit:
Если существует переменное количество нескольких строк и требуется объединить их до тех пор, пока не появится пустая строка, используйте следующую команду:
awk '{if($0=="click"){getline n; printf "%s(%s", $0, n;
while($0!=""){printf ",%s", $0; getline};
printf ")\n\n", x}else{print}}' file
Она печатает строки, разделенные запятыми, пока не найдет пустую строку.
-121--133211-
У меня был тот же вопрос, что и у вас, но для обычного пользователя. Допустим, я хочу запустить firefox с помощью учетной записи пользователя foo. Я вошел в систему как бар:
[bar@localhost ~]$ sudo -u foo -H firefox
К сожалению, эта команда не удалась с той же ошибкой, что и в вопросе (т.е. не указан ни один протокол и не может открыть дисплей)
Моим решением было просто добавить пользователя foo в список авторизованного доступа к серверу X.
xhost si:localuser:foo
И тогда я смог запустить Firefox (и другое приложение X) с помощью sudo
и пользователя foo.
Фон : В окне X имеется архитектура клиент/сервер. При запуске приложения запрашивается разрешение X-сервера на его отображение. По умолчанию, как только вы открываете сеанс (вы графически входите в систему), вам (вашему пользователю), очевидно, разрешено общаться с сервером и отображать приложения. Другие пользователи не имеют этого разрешения, если его не указать. xhost
- это средство для управления списком разрешений. si
указывает на то, что правило является серверным, и уполномочивает локального пользователя foo
отображать приложения. X Window является очень мощным в этом отношении, и вы можете отображать удаленные приложения локально, играя с переменной среды ДИСПЛЕЕВ
и xhost
(но не ограничиваясь ими). В более старые времена, когда люди набирали xhost +
и неявно позволяли всем использовать свою X-сессию, можно было отображать приложение на своем экране для приколов; -) не столько сейчас, сколько люди все меньше используют X Window клиент/серверную архитектуру (по крайней мере для того, что я наблюдаю за последние 10 лет).
PS: Я сделал это, чтобы запустить Firefox в своего рода «тюрьме» (чтобы избежать уязвимости, как для pdf.js в будущем). Но я быстро выяснил, что вызов Firefox через sudo не позволит ему получить доступ ни к аудио, ни к видеоаппаратуре. Но есть один парень, который ясно объясняет , как активировать аппаратное ускорение видео и аудио при вызове Firefox через sudo . YMMV с этими инструкциями, например, мне все еще отказано в разрешении на аудио, но видео нормально (протестировано на Fedora 22 с SELinux ON).
-121--11008-
Проверьте справочную страницу для последней оболочки Борна:
http://schillix.sourceforge.net/man/man1/bosh.1.html
и найдите раздел «Подстановка параметров», который в настоящее время находится на странице 8. Две страницы вниз, есть таблица, которая объясняет все возможные расширения.
Оболочка Борна поддерживает в подстановке параметров не только '-'.
Вы можете заменять по одному в цикле, например:
tree --noreport | sed $'
:1
s/^\\( *\\)\\([\ua0\u2500\u2502\u2514\u251C]\\)\\([\ua0\u2500\u2502\u2514\u251C ]*\u2500 \\)/\\1 \\3/
t1
s|\u2500 | /|'
(вы пропустили\ua0
(неразрывный пробел -)и \u2502
(│
, также показанные в вашем образце ), по крайней мере, которые действительно отображаются в выводе моей версии tree
, по крайней мере, ).
Это обман, если есть файлы, имя которых содержит "─ "
, которому необязательно предшествуют некоторые из этих символов.
Другой подход (, предполагающий, что вы действительно хотите вставить /
и что каталоги, которые вы вызываете tree
, не содержат"─ "
):вставьте /
после первого вхождения "\u2500 "
. ], а затем замените каждый символ перед первым /
пробелом в цикле.
tree --noreport | sed '
s|'$'\u2500'' |&/|;t1
b
:1
s|^\( *\)[^ /]|\1 |
t1'
Сperl
:
tree --noreport | perl -C -pe 's{^.*?\x{2500} }{" " x length($&). "/"}e'
Это функция bash
, которая рекурсивно выводит имена, найденные в верхнем каталоге.:
mytree () (
topdir="${1-.}"
indent="${2-0}"
shopt -s nullglob
shopt -s dotglob
# output directory name
printf "%${indent}s'%s'/\n" "" "${topdir##*/}"
indent=$(( indent + 4 ))
for name in "$topdir"/*; do
if [ -h "$name" ]; then
# output symbolic link name and target
printf "%${indent}s'%s' --> '%s'\n" "" "${name##*/}" "$( readlink -- "$name" )"
elif [ -d "$name" ]; then
# recurse into directories
mytree "$name" "$indent"
else
# output other type of name (not directory or symbolic link)
printf "%${indent}s'%s'\n" "" "${name##*/}"
fi
done
)
Функция mytree
принимает один аргумент (второй аргумент используется только в рекурсивных вызовах )который является верхним каталогом для обработки. Если аргументы не указаны, он будет использовать текущий каталог в качестве верхнего каталога для списка.
Вывод выглядит следующим образом:
'Work'/
'Data'/
's3wes.all.tab.frq.counts'
's3wes.con.tab.frq.counts'
'sullivan.txt'
'Development'/
'ENA-submission'/
'.git'/
'COMMIT_EDITMSG'
и т. д.
То есть имена заключаются в одинарные кавычки, а каталоги заканчиваются /
. Кроме того, символические ссылки будут отображаться как, например,
'embl-validator.jar' --> 'embl-api-validator-1.1.158.jar'
Формат вывода можно легко изменить, изменив три вызова printf
.