Как получить конкретную информацию из двух текстовых строк и собрать имя файла из этого

Как сказал Бени Чернявский-Паскин и Пол Ламмерцма в вышеприведенных комментариях xinput map-to-output <device> <output> сделал трюк для меня!

вам сначала нужно запустить xinput, чтобы получить идентификатор inupt-устройства, [!d1 ]

приведенная выше команда возвращает что-то вроде этого для меня.

user@user-hpEnvy:~$ xinput
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech Unifying Device. Wireless PID:401b   id=10   [slave  pointer  (2)]
⎜   ↳ Logitech Unifying Device. Wireless PID:4016   id=11   [slave  pointer  (2)]
⎜   ↳ ELAN20E7:00 04F3:20E7                     id=13   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=15   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Video Bus                                 id=8    [slave  keyboard (3)]
    ↳ Power Button                              id=9    [slave  keyboard (3)]
    ↳ HP Truevision HD                          id=12   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=14   [slave  keyboard (3)]
    ↳ HP Wireless hotkeys                       id=16   [slave  keyboard (3)]
    ↳ HP WMI hotkeys    

Затем я запустил xrandr, чтобы получить список экранов, а вывод команды подобен этому

[ f2]

В моем случае сенсорное устройство ELAN20E7:00 04F3:20E7 id=13, а экран с сенсорным экраном eDP1, чтобы исправить проблему, мне нужно отобразить устройство на этом мониторе только для этого, я выполнил эту команду xinput map-to-output 13 eDP1

Проблема решена и ее работа отлично снова :)

am используя элементарную ОС freya, поэтому она должна работать для всех дистрибутивов на основе ubntu 14.04 LTS

2
задан 22 December 2017 в 00:27

4 ответа

Вот ужасно запутанная оболочка с одним слоем (с использованием формата даты, который вы упомянули в чате):

$ name=$(printf 'backup-logfiles-%s-til-%s' $(date -d "$(head -n1 logfile | grep -oP '\[\K\S+' | sed 's|/| |g; s/:/ /')" +%Y-%m-%d-%H:%M:%S) $(date -d "$(tail -n1 logfile | grep -oP '\[\K\S+' | sed 's|/| |g; s/:/ /')" +%Y-%m-%d-%H:%M:%S))
$ echo $name
logfiles-2017-01-21-14:53:49-til-2017-12-20-16:17:50

Чтобы получить начальную и конечную переменные отдельно, выполните:

$ start=$(head -n1 logfile | grep -oP '\[\K\S+' | sed 's|/|-|g; s/:/ /')
$ end=$(tail -n1 logfile | grep -oP '\[\K\S+' | sed 's|/|-|g; s/:/ /')
$ echo "backup-logfiles-$start-til-$end.tar.gz"
backup-logfiles-21-Jan-2017 14:53:49-til-20-Dec-2017 16:17:50.tar.gz

Или, если вы хотите числовую дату:

$ start=$(date -d "$(head -n1 logfile | grep -oP '\[\K\S+' | sed 's|/|-|g; s/:/ /')" +%Y-%m-%d-%H:%M:%S)
$ end=$(date -d "$(tail -n1 logfile | grep -oP '\[\K\S+' | sed 's|/|-|g; s/:/ /')" +%Y-%m-%d-%H:%M:%S)
$ echo "backup-logfiles-$start-til-$end.tar.gz"
backup-logfiles-2017-01-21-14:53:49-til-2017-12-20-16:17:50.tar.gz
2
ответ дан 22 May 2018 в 16:52

Использование только sed, только для веселого гольфа;)

name=$(sed -rn 's|/|-|g;s/.* \[([^ ]+) .*/\1/;1p;$p' file | sed 'N;s/\n/-til-/') $ echo $name 21-Jan-2017:14:53:49-til-20-Dec-2017:16:17:50

Но если этот файл - это то, что вы хотите передать на tar, двоеточия могут вызвать проблемы:

An archive name that has a colon in it specifies a file or device on a remote machine. The part before the colon is taken as the machine name or IP address, and the part after it as the file or device pathname, e.g.: --file=remotehost:/dev/sr0

Вы можете обойти это, передав опцию:

--force-local Archive file is local even if it has a colon.

Но вот команда, которая заменяет двоеточия более дефисом:

name=$(sed -rn 's|[/:]|-|g;s/.* \[([^ ]+) .*/\1/;1p;$p' file | sed 'N;s/\n/-til-/')

Вместо этого из символьного класса мы могли бы использовать чередование и сохранить байт:)

name=$(sed -rn 's#/|:#-#g;s/.* \[([^ ]+) .*/\1/;1p;$p' file | sed 'N;s/\n/-til-/')

Примечания

-r использовать ERE -n ничего не печатать, пока мы его не попросим s|/|-|g замените все символы / на - (потому что мы не можем иметь имя файла с /) s|[/:]|-|g заменять символы / и : символами везде. s#/|:#-#g замените / или : на - во всех ; отдельных sed командах s/.* \[([^ ]+) .*/\1/, фиксируя дату и время между квадратными скобками (от первого [ до первого пробела). 1p;$p печатает только первую строку, а последняя строка | переводит ее в другую sed (ugh!) N, читает обе строки в пространстве шаблонов ... s/\n/-til-/ ... поэтому мы можем заменить newline с -til-
2
ответ дан 18 July 2018 в 00:46

Использование только sed, только для веселого гольфа;)

name=$(sed -rn 's|/|-|g;s/.* \[([^ ]+) .*/\1/;1p;$p' file | sed 'N;s/\n/-til-/')
$ echo $name
21-Jan-2017:14:53:49-til-20-Dec-2017:16:17:50

Но если этот файл - это то, что вы хотите передать на tar, двоеточия могут вызвать проблемы: [!d2 ]

An  archive  name  that has a colon in it specifies a file or device on a remote
machine.  The part before the colon is taken as the machine name or IP address,
and the part after it as the file or device pathname, e.g.:

    --file=remotehost:/dev/sr0

Вы можете обойти это, передав опцию:

--force-local
      Archive file is local even if it has a colon.

Но вот команда, которая заменяет двоеточия более дефисом:

name=$(sed -rn 's|[/:]|-|g;s/.* \[([^ ]+) .*/\1/;1p;$p' file | sed 'N;s/\n/-til-/')

Вместо этого из символьного класса мы могли бы использовать чередование и сохранить байт:)

name=$(sed -rn 's#/|:#-#g;s/.* \[([^ ]+) .*/\1/;1p;$p' file | sed 'N;s/\n/-til-/')

Примечания

-r использовать ERE -n ничего не печатать, пока мы его не попросим s|/|-|g замените все символы / на - (потому что мы не можем иметь имя файла с /) s|[/:]|-|g заменять символы / и : символами везде. s#/|:#-#g замените / или : на - во всех ; отдельных sed командах s/.* \[([^ ]+) .*/\1/, фиксируя дату и время между квадратными скобками (от первого [ до первого пробела). 1p;$p печатает только первую строку, а последняя строка | переводит ее в другую sed (ugh!) N, читает обе строки в пространстве шаблонов ... s/\n/-til-/ ... поэтому мы можем заменить newline с -til-
2
ответ дан 22 May 2018 в 16:52

Использование только sed, только для веселого гольфа;)

name=$(sed -rn 's|/|-|g;s/.* \[([^ ]+) .*/\1/;1p;$p' file | sed 'N;s/\n/-til-/') $ echo $name 21-Jan-2017:14:53:49-til-20-Dec-2017:16:17:50

Но если этот файл - это то, что вы хотите передать на tar, двоеточия могут вызвать проблемы:

An archive name that has a colon in it specifies a file or device on a remote machine. The part before the colon is taken as the machine name or IP address, and the part after it as the file or device pathname, e.g.: --file=remotehost:/dev/sr0

Вы можете обойти это, передав опцию:

--force-local Archive file is local even if it has a colon.

Но вот команда, которая заменяет двоеточия более дефисом:

name=$(sed -rn 's|[/:]|-|g;s/.* \[([^ ]+) .*/\1/;1p;$p' file | sed 'N;s/\n/-til-/')

Вместо этого из символьного класса мы могли бы использовать чередование и сохранить байт:)

name=$(sed -rn 's#/|:#-#g;s/.* \[([^ ]+) .*/\1/;1p;$p' file | sed 'N;s/\n/-til-/')

Примечания

-r использовать ERE -n ничего не печатать, пока мы его не попросим s|/|-|g замените все символы / на - (потому что мы не можем иметь имя файла с /) s|[/:]|-|g заменять символы / и : символами везде. s#/|:#-#g замените / или : на - во всех ; отдельных sed командах s/.* \[([^ ]+) .*/\1/, фиксируя дату и время между квадратными скобками (от первого [ до первого пробела). 1p;$p печатает только первую строку, а последняя строка | переводит ее в другую sed (ugh!) N, читает обе строки в пространстве шаблонов ... s/\n/-til-/ ... поэтому мы можем заменить newline с -til-
2
ответ дан 24 July 2018 в 17:17

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

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