Разница между часами и HRT создает проблемы со многими приложениями и онлайн-играми [dублировать]

Вот еще несколько подходов. Я использую PATH с каталогами, содержащими обратную косую черту, пробелы и даже новую строку, чтобы показать, что они должны работать с чем угодно (кроме cut, который не работает на символах новой строки):

$ echo "$PATH"
/bin:usr/bin/:/usr/local/bin:/some\ horrible thing:/even 
new lines
Некоторые способы Perl:
$ perl -pe 's/:/\n/g' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even 
new lines
-p означает «распечатать каждую строку ввода после применения сценария, заданного -e». Сценарий использует оператор подстановки (s/oldnew/), чтобы заменить все : на новые строки.
$ perl -lne 'print for split /:/' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even 
new lines
-l добавляет новую строку для каждого вызова print. Здесь сценарий разбивает свой вход на :, а затем перебирает каждый разделительный элемент и печатает его.
$ perl -F: -ane '$"="\n";print "@F"' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even 
new lines
-a заставляет perl вести себя как awk: он разделяет каждую из своих входных строк на символ, заданный -F (поэтому :, здесь) и сохраните результат в массиве @F ]. [F24] является специальной переменной Perl, «разделителем списков», значение которой печатается между каждым элементом печатного списка. Поэтому установка его в новую строку сделает print @list печать каждого элемента @list, а затем новой строки. Здесь мы используем его для печати @F.
$ perl -F: -ane 'print join "\n", @F' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even 
new lines
Та же идея, что и выше, только меньше в гольф. Вместо использования $" мы явно join вводим массив с символами новой строки, а затем печатаем. Простой grep с магией PCRE:
$ grep -oP '(^|:)\K[^:]+' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even 
new lines
-o делает grep печать только соответствующей части каждой строки, поэтому каждое соответствие печатается на отдельной строке. [F33] позволяет Perl Compatible Regular Expressions (PCRE). Регулярное выражение ищет отрезки не : ([^:]+), которые следуют либо в начале строки (^), либо в символе :. [F38] - это трюк PCRE, который означает «отбросить все, что соответствует до этой точки», и используется здесь, чтобы избежать печати :. И cut решение (это не удается для строк новой строки, но может иметь дело с обратными косыми чертами и пробелами):
$ cut -d: -f 1- --output-delimiter=$'\n' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even 
new lines
Используемыми параметрами являются -d:, который устанавливает разделитель ввода в :, -f 1-, что означает печать всех полей (от 1-го до конца) и --output-delimiter=$'\n', который устанавливает разделитель вывода, нужный. [F45] является цитированием ANSI C и является способом печати символа новой строки в оболочке.

Во всех приведенных выше примерах я использую оператор bash (и некоторые другие оболочки) здесь string (<<<) для передачи строки в качестве ввода в программу. Таким образом, command <<<"foo" эквивалентен echo -n "foo" | command. Обратите внимание, что я всегда цитирую "$PATH", без кавычек оболочка бы съела символ новой строки.

здесь строка дала другой подход в комментариях, который слишком хорош, чтобы не включать:

$ perl -0x3a -l012 -pe '' <<<"$PATH"

Это то, что известно как комментарии . [F50] определяет разделитель входных данных как восьмеричное или шестнадцатеричное число. Это то, что определяет «строку», а значение по умолчанию - \n, символ новой строки. Здесь мы устанавливаем его в :, который является x3a в шестнадцатеричном формате (try printf '\x3a\n'). [F55] делает три вещи. Сначала он удаляет разделитель входных записей ($/) с конца каждой строки, эффективно удаляя : здесь - и во-вторых, устанавливает разделитель выходной записи ($\) на любое восьмеричное или шестнадцатеричное значение, которое оно задано (012 - \n). Если $\ определен, он добавляется к концу каждого вызова print, поэтому это приведет к добавлению новой строки к каждому print.

-pe будет печатать каждую строку ввода после применения сценария, заданного -e. Здесь нет сценария, потому что вся работа выполняется флажками параметров, как описано выше!

2
задан 8 January 2018 в 00:53

0 ответов

Другие вопросы по тегам:

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