мы можем распечатать последнее слово каждой строки в Linux с помощью sed команду?

Нет Вы не можете, разрешение sysfs определяется в пространстве ядра и не может быть изменено с инструментами пространства пользователя (если с поддержкой стороны ядра).

Но для Вашей собственной проблемы, Вы могли установить sudo запись, которые позволяют всем писать в тот путь, т.е. ALL ALL = (ALL) NOPASSWD: /usr/bin/tee /sys/class/leds/asus\:\:kbd_backlight/brightness

И когда Вы пишете в тот каталог, используйте сценарий как это, echo 1 | sudo /usr/bin/tee "/sys/class/leds/asus::kbd_backlight/brightness"

9
27.01.2015, 22:44
9 ответов
awk '{print $NF}'
sed 's/[[:blank:]]*$//;s/.*[[:blank:]]//'

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

awk 'NF{print $NF}'
sed 's/[[:blank:]]*$//;s/.*[[:blank:]]//;/./!d'
8
27.01.2020, 20:04

Вы можете попробовать:

  • SED 'S / //'
  • awk '{print $ nf}'
4
27.01.2020, 20:04

Ты почти там. Просто укажите последнее слово:

sed 's/^.* \([^ ][^ ]*\)/\1/g'

Что он делает:

  1. '^. *' Удаляет все в начале строки и любых пробелов.
  2. '\ (...) \' соответствует шаблону и возвращает его как \ 1.
  3. «[^]» совпадает с чем-либо без места в нем.

(отредактировал, чтобы добавить лучшее решение. Спасибо Хильдред!)

4
27.01.2020, 20:04

Вы могли бы использовать адекватный рисунок GREP вместо SED , например:

grep -o "[a-Z0-9]*$"

в этом примере [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] содержит диапазоны персонажей, которые считаются соответствующими для «слова» (буквенно-цифровые данные в этом случае, могут быть добавлены другие символы, некоторые из которых должны быть сбережены).

2
27.01.2020, 20:04

Но в последней строке вывода системного журнала сообщается, что программа не может найти «vncserver» и предлагает использовать vnc4server.
Просто попробуйте:

msfl@chanakyauat:~$ vnc4server
-121--244495-

Используйте такую функцию bash:

seq 1 30 > input.txt
f(){ head $1 input.txt | tail $2 >> output.txt ;}; f -11 -2; f -24 -3
cat output.txt
10
11
22
23
24

В этом случае это немного перебор, но если ваши фильтры вырастут больше, это может стать благом.

-121--43292-

Да. Следующая команда sed сначала удаляет все конечные пробелы ( s/* $//), а затем все до последнего пробела ( s/. */). Вероятно, стоит заменить литеральное пробельное пространство на [[: пустое:]] , чтобы захватить вкладки и другие символы, похожие на пробел.

$ echo "  aaa bbb cc   " | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "  aaa bbb cc" | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "aaa bbb cc   " | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "aaa bbb cc" | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "  cc  " | sed -e 's/ *$//' -e 's/.* //'
cc
$ echo "cc" | sed -e 's/ *$//' -e 's/.* //'
cc
-1
27.01.2020, 20:04

Переменная awk $NF является последним полем каждой записи ; вы можете использовать ее, чтобы распечатать только последние поля вашего файла следующим образом:

awk '{print $NF}' file
6
27.01.2020, 20:04

Если вы квалифицируете слово как означающее любую последовательность из 1 или более непустых символов , то ответ определенно положительный, и это тоже очень просто делается. Это потому, что [[: blank:]] * и [^ [: blank:]] * являются логическими дополнениями и - при условии, что все символы в строке являются полными - [[: blank:]] * U [^ [: blank:]] * может описывать любую возможную строку почти так же, как . * .

Если в строке существует неполный символ или иным образом недопустимая последовательность байтов, ни один из них не может успешно описать ее от начала до конца - что иногда может происходить при интерпретации строки в неправильной кодировке. Чтобы обеспечить полный символ на байт в любой строке, локаль C может быть принудительно установлена, например:

LC_ALL=C sed ...

... что позволит избежать любых проблем, описывающих строку от начала до конца с помощью всеобъемлющего шаблона, такого как . * или ([] * [^] *) *

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

BRE:

sed 's/\(\([^[:blank:]]*\)[[:blank:]]*\)*/\2/'

ERE:

sed -E 's/(([^[:blank:]]*)[[:blank:]]*)*/\2/'

Обе эти версии по-прежнему будут печатать пустые строки, потому что звездочка Kleene * соответствует нулю или более вхождений шаблона. Сначала он сопоставляет ноль или более непустых символов, затем ноль или более пустых символов, затем ноль или более совпадений сгруппированных совпадений до тех пор, пока строка не будет полностью совпадать.

После сопоставления всего этого происходит волшебство замены - ссылки, возвращаемые группами \ 1 и \ 2 , являются последними вхождениями каждой из них. Таким образом, когда замена выполняется, вся строка заменяется только последним вхождением в строке нуля или более непустых символов - или подгруппой \ 2 .

Конечно, это работает для любой возможной строки - даже пустой - что означает, что обе формы будут печатать символы новой строки для строк, которые содержат только пустые символы или вообще не содержат. Чтобы справиться с этим, вы можете сделать несколько вещей, но сначала давайте упростим ввод класса символов:

b='[:blank:]'

Теперь, чтобы печатать, только если строка содержит один или несколько непустых символов, вы можете сделать:

BRE:

sed -n "s/\(\([^$b]*\)[$b]*\)*/\2/;/./p"

ERE:

sed -En "/[^$b]/s/(([^$b]*)[$b]*)*/\2/p"
  1. Случай BRE - подстановка выполняется всегда и печатаются только пробелы шаблона с хотя бы одним оставшимся символом.
  2. Случай ERE - замена выполняется только в пространстве шаблонов, содержащем хотя бы один непустой символ.

Любая форма будет работать с любым методом - при условии правильного синтаксиса.

Переключатель -n отключает автопечать пространства шаблонов, а флаг p для s /// ubstitution или / адрес / команды печатает свои результаты только в случае успеха.

Эту же логику можно применить для получения любого {num} -го вхождения, например:

BRE:

sed -n "s/\([$b]*\([^$b]\{1,\}\)\)\{num\}.*/\2/p"

ERE:

sed -En "s/([$b]*([^$b]+)){num}.*/\2/p"

... где num в обоих регулярных выражениях можно заменить на число, чтобы напечатать только {num} -е указанное вхождение последовательности непустых символов. Здесь используется немного другая форма, чтобы гарантировать, что счет не перекошен для начального пробела в строке.

Обратите внимание, что переключатель -E ERE на sed поддерживается как в версиях BSD, так и в версиях GNU, хотя это еще не стандартный синтаксис POSIX.

0
27.01.2020, 20:04
cat file_name | rev | cut -f1 -d ' ' | rev
-1
27.01.2020, 20:04
sed 's/^ star.star //'  filename  or sed 's/^[[:blank:]]star.star[[:blank:]]//' filename

Анализ:

  • s--замена

  • /--начало выражения для поиска

  • ^--с начала строки

  • [[:blank:]]*--если в начале строки есть пробелы в случае

  • .*--любой символ

  • [[:blank:]]--и пробел

  • /--начало выражения для замены

  • /--конец синтаксиса команды

PS :Я написал звездочку в команде.

0
12.05.2020, 10:08

Теги

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