Использование sed для замены всех вхождений в начале на соответствующее количество заменяемых строк

С помощью 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. Две страницы вниз, есть таблица, которая объясняет все возможные расширения.

Оболочка Борна поддерживает в подстановке параметров не только '-'.

1
26.03.2018, 14:29
2 ответа

Вы можете заменять по одному в цикле, например:

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'
1
27.01.2020, 23:32

Это функция 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.

1
27.01.2020, 23:32

Теги

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