Замените несколько пробелов одним использованием 'TR' только

Как всегда, существует, вероятно, миллион способов сделать это и способ, которым я читал, Ваш вопрос Ваш идут о Вашей проблеме неправильным путем, но первыми вещами сначала.

После введения Вашего имени пользователя и пароля правильно все сценарии в /etc/X11/Xsession.d получены (не выполненный, это - очень важное различие!) в алфавитном порядке. Таким образом, если Вы хотите, чтобы некоторая логика произошла после входа в систему, но прежде чем Ваша настольная среда запускается, это - место для помещения сценариев.

В таком сценарии Вы могли поместить

for item in $(grep "stuff" /file/one)
do
  echo "@program ${item}" >> /etc/xdg/lxsession/LXDE/autostart
done

Это добавит строки, Вы хотите зарегистрировать Вас, хотят добавить их к. Это'>>', который заставляет оболочку добавить строки в конец файла, вместо того, чтобы заменить файл. Это - ответ на Ваш вопрос.

Теперь вот проблема: с таким сценарием результат Вашего grep будет добавлен к файлу автоматического запуска каждый раз, когда Вы входите в систему своей машины. Так в первый раз, когда программа будет запущена однажды. В следующий раз Вы входите в систему дважды и три раза на Вашем следующем входе в систему. Список Ваших программ автоматического запуска будет продолжать расти пока Ваши результаты урожаев grep для добавления к файлу автоматического запуска. Вот почему я первоначально сказал, что Вы идете о своей проблеме неправильным путем.

Далее, нет просто глобального /etc/xdg/lxsession/LXDE/autostart. У Вас может быть файл ~/.config/lxsession/LXDE/autostart для каждого отдельного пользователя. Даже если Вы - единственный пользователь, работающий над Вашей машиной, необходимо скорее отредактировать файл в корневом каталоге (~ расширяется до Вашего корневого каталога), чем глобальный.

И поскольку заключительный совет, если Вы хотите запустить программы, просто добавляет запись в Ваш ~/.config/lxsession/LXDE/autostart для сценария оболочки, который делает для цикла как указано выше, но вместо того, чтобы добавить строки к немного, регистрируют Вас, на самом деле выполняет команды. Когда Вы команды выполнения с & в конце строки те программы будут запущены в фоновом режиме, и сценарий не заблокируется.

73
24.09.2015, 13:48
6 ответов
[

] С помощью []tr[] используйте опцию повтора [][]s[] queeze[]:[

] [
$ tr -s " " < file
ID Name
1 a
2 b
3 g
6 f
] [

] или вы можете использовать решение [] awk[]: [

] [
$ awk '{$2=$2};1' file
ID Name
1 a
2 b
3 g
6 f
] [

] Когда вы меняете поле в записи, [] awk[] перестраивает [] $0[], берет все поля и соединяет их вместе, разделенные [] OFS[], что является пробелом по умолчанию. [

] [

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

].
109
27.01.2020, 19:31
[

] Просто используйте [][] столбец [][]: [

] [
column -t inputFile
] [

] выход:[

] [
ID  Name
1   a
2   b
3   g
6   f
]
20
27.01.2020, 19:31

Кому нужна программа (кроме оболочки)?

while read a b
do
    echo "$a $b"
done < f1.txt

Если Вы хотите, чтобы значения во второй колонке выстраивались в линию, как в ответе полимера в колонке , использовать printf вместо echo:

while read a b
do
    printf '%-2s %s\n' "$a" "$b"
done < f1.txt
5
27.01.2020, 19:31

Если вы хотите сжать «пустое пространство», вы захотите использовать pre- определенные наборы символов ": blank:" (горизонтальные пробелы и табуляция) или ": space:" (вертикальные пробелы):

/bin/echo -e  "val1\t\tval2   val3" | tr -s "[:blank:]"

Примеры выполнялись в Red Hat 5 (GNU tr).

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

Как указано во втором комментарии dastrobu, я пропустил формулировку на странице руководства:

 -s uses the last specified SET, and occurs after translation or deletion.

Это позволяет нам удалить первый tr. Престижность за его терпение перед лицом моей тупости.

Раньше парсинг порта из конфигурации Redis. файл:

grep "^port" $redisconf | tr "[:blank:]" " " | tr -s "[:blank:]"  | cut -d" " -f2

После, с указанием SET2 с помощью squeeze:

grep "^port" $redisconf | tr -s "[:blank:]" " " | cut -d" " -f2

Вывод:

6379

Для получения более подробной информации о нюансах пробелов

Продемонстрируйте, где только сжатие не удается, когда последовательные смешанные символы, которые попадают в [: blank :] класс символов задействован:

 /usr/bin/printf '%s \t %s' id myname | tr -s "[:blank:]"  | od -cb
0000000   i   d      \t       m   y   n   a   m   e
        151 144 040 011 040 155 171 156 141 155 145
0000013

Примечание: Мои два строковых поля в формате printf разделены 1 пробелом, 1 табуляцией, 1 пробелом. После сжатия эта последовательность все еще существует. В выходных данных восьмеричного дампа это представлено последовательностью ascii 040 011 040.

8
27.01.2020, 19:31

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

-L max-lines
   Use at most max-lines nonblank input lines per command line.
   Trailing blanks cause an input line to be logically continued 
   on the next input line.  Implies -x.

, так что cat f1.txt | xargs -L1, кажется, выводит именно то, что вы хотите.

2
27.01.2020, 19:31

Самым простым решением для обрезки строки пробелов является использование команды xargs. Пример:

[root@localhost ~]# echo "    bla   bla     truc "|xargs
bla bla truc

После этого вы можете легко запрограммировать цикл с помощью команды cutдля получения значений и управления ими. Вот точный пример:

[root@localhost ~]# cat <<EOF>f1.txt
ID     Name
1      a
2         b
3   g
6            f
EOF
[root@localhost ~]# cat testscr.sh

#!/bin/bash
i=0
onelinevars=`cat f1.txt |xargs`
while [[ "$i" -lt `echo $onelinevars|wc -w` ]]; do
  if [[ $((i%2)) -eq 1 ]]; then
    echo -n `echo $onelinevars|cut -d ' ' -f $i`
    echo -n ' '
    echo `echo $onelinevars|cut -d ' ' -f $((i+1))`
  fi
  i=$((i+1))
done
[root@localhost ~]#./testscr.sh

ID Name
1 a
2 b
3 g
6 f
-1
11.06.2020, 11:00

Теги

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