Как удалить начальные пробелы в нескольких строках на основе отступа в первой строке?

Я не пробовал это с LXDE, но теоретически он не должен завершать эти процессы, если:

а. Это лидер сессии, что маловероятно. б. Он добровольно решает их убить. в. Какой-то другой процесс завершает их работу в результате завершения работы lxpanel (или другого средства запуска ).

Я не думаю, что это относится к lxpanel. В некоторых более монолитных средах (, например, Gnome Shell ), некоторые аналогичные действия могут привести к завершению работы всей оболочки и, следовательно, всех приложений.

Связанный ответ:https://unix.stackexchange.com/a/158736/58388

3
09.02.2021, 13:29
4 ответа

Зачем ограничиваться первой строкой? Пока вам не нужно обрабатывать гигабайты данных, где хранение всего этого в памяти было бы проблемой, вы можете просто сохранить самое длинное первое поле, а затем использовать его для форматирования остальных :

.
$ cat lines 
      4.yml
      1.sh
      1.ico
      1.gitignore
      1.css
     30.md
      1.txt
      8.png

И:

$ awk -v l=0 '{ 
                if(length($1)>l){
                    l=length($1)
                } 
                a[$2]=$1
              }
              END{
                for(line in a){
                    printf "%"l"s %s\n",a[line],line
                }
             }' lines 
 8.png
 1.ico
 1.txt
 1.css
 1.sh
30.md
 1.gitignore
 4.yml

Так:

$ awk -v l=0 '{ if(length($1)>l){l=length($1)} a[$2]=$1}END{for(line in a){printf "%"l"s %s\n",a[line],line}}' lines | 
    column -x | expand -t 8
 8.png          1.ico          1.txt          1.css          1.sh
30.md           1.gitignore    4.yml

Если вам это не нужно и вам нужна только первая строка, вы можете упростить до:

$ perl -pe '/^(\s+)/; $l//=$1; s/^$l//' lines | column -x | expand -t 8
30.md           4.yml          1.sh           1.ico          1.gitignore
 1.css          1.txt          8.png
2
18.03.2021, 22:31

Я должен был изучить awk (1)раньше. По крайней мере, я мог бы написать небольшую программу, которая запоминает количество начальных пробелов в первой строке и форматирует каждую строку:

$ awk '
    NR==1 && match($0, /^ */) {p=RLENGTH+1};
    {print(substr($0,p))}
' lines | column -x | expand -t 8
30.md           8.png          4.yml          1.css          1.gitignore
 1.ico          1.sh           1.txt
2
18.03.2021, 22:31

Gnu sed :сохраняет начальные пробелы в памяти, а затем удаляет такое количество начальных пробелов из каждой строки. Предполагая, что строки отсортированы, как показано.

sed -Ee '
  1{h;s/\S.*//;x;}
  G;s/^(\s*)(.*)\n\1$/\2/
' file

awk '
NR==1 {
  l0=length()
  $1=$1
  re = "^\\s{" l0-length() "}"
}
sub(re, "")+1
' file

perl -lpe '
  $x //= do{/^\s*/g;+pos;};
  $_ = substr($_,$x);
' file
6
18.03.2021, 22:31

Надеюсь, я понимаю, и я на правильном пути:

$ sed 's/^[[:blank:]]//' file | cut -d' ' -f3- | column -x | expand -t 8 | cut -d' ' -f3-
30.md           8.png          4.yml          1.css          1.gitignore
 1.ico          1.sh           1.txt

Например, для такого сценария:

     30.md
      8.png
      4.yml
      1.css
      1.gitignore
   4000.ico
      1.sh
      1.txt
    300.foo
$ sed 's/^[[:blank:]]//' file | cut -d' ' -f3- | column -x | expand -t 8 | cut -d' ' -f3-
30.md           8.png          4.yml          1.css       4000.ico      
 1.gitignore    1.sh           1.txt        300.foo

2
18.03.2021, 22:31

Теги

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