Кевин в комментариях к вопросу предложил использовать vlc-wrapper.У меня были проблемы с тем, как его использовать, поэтому я опишу, как я заставил его работать:
вам нужно установить непривилегированного пользователя в SUDO_UID: export SUDO_UID=1000
если у вас нет пользователя для запуска vlc под создайте его:
useradd -g users vlc
# this will show you the uid of vlc user
id -u vlc
если вы хотите, чтобы переменная SUDO_UID была постоянной, добавьте ее в bashrc:
echo "export SUDO_UID=1000" >> /root/.bashrc
будьте осторожны, чтобы не написать одиночный > вместо > >
затем используйте vlc-wrapper вместо vlc
С sed
вы можете сделать
sed '/^#/!s/\([^ ]* *\)\{18\}[a-z]*\([A-Z]\).*/& \2/'
Это для всех строк, не начинающихся с #
(/^#/! селектор
), после 18 комбинаций не пробелов и пробелов пометить заглавную букву \(\)
для последующего обращения к ней, "заменить" всю строку самой собой и добавить пробелы с найдена заглавная буква.
Если вы предпочитаете расширенные регулярные выражения, вы также можете использовать
sed -E '/^#/!s/([^ ]* *){18}[a-z]*([A-Z]).*/& \2/'
Если столбцы разделены табуляцией вместо пробелов, вы выбираете
sed -E '/^#/!s/([^\t]*\t){18}[a-z]*([A-Z]).*/&\t\2/'
Чтобы ответить на ваш буквальный вопрос о том, как это сделать с помощью grep
в одиночку. Несмотря на то, что grep
не был разработан для этого, с GNU grep
и построенным с поддержкой PCRE, вы можете сделать:
grep -Po '(?:^(?:[^\t]*\t){18}|\G)[^\t]*?\K[[:upper:]]'
Это поиск 18 последовательностей < not-TABs>
в начале строки или в конце предыдущего совпадения (\G
), за которым следует наименьшее возможное количество символов без табуляции (так что мы по-прежнему в 19-м поле), за которым следует заглавная буква, но с помощью \K
мы сбрасываем начало совпадающей части непосредственно перед этой заглавной буквой.
Таким образом, при вводе типа:
X<tab>X<tab>....<tab>AbC<tab>X<tab>...
Он сообщит:
A
C
Как с вашим вырезом | подход grep
.
Если вас интересует только первый символ верхнего регистра в 19-м поле, вы можете упростить его до:
grep -Po '^(?:[^\t]*\t){18}[^\t]*?\K[[:upper:]]'
Чтобы вставить его как 20-й столбец, вы можете сделать:
paste <(cut -f1-19 < file) <(grep ...above < file) <(cut -f20- < file) > newfile
Или чтобы вставить его в качестве последнего столбца:
grep... < file | paste file - > newfile
is there any option or parameter in grep to specify a column?
grepне имеет опцииразделителя полей .
Вместо этого используйте следующий подход awk :
awk -F'\t' -v OFS='\t' '{match($19,/[A-Z]+/); $20=substr($19,RSTART,RLENGTH) FS $20}1' 1.table
match($19,/[A-Z]+/)
-захватывает прописные буквы в 19-м поле
$20=substr($19,RSTART,RLENGTH) FS $20
-извлекает совпадающие прописные буквы из 19 го поля и вставляет их как значение 20 го поля