Используйте команду sed, чтобы проверить, существует ли конкретная строка, если нет, добавьте ее

Надеюсь, это совместимо с вашим Solaris - я тестировал его под SunOS 5.10 с bash 4.3.26:

find . | while read f; do
    if [ ! -d "$f" ]; then
        echo $(basename "$f"),$(dirname "$f")
    fi
done

Здесь просто используется базовое имя и имя каталога для разделения имени файла .

$ find test | while read f; do if [ ! -d "$f" ]; then echo $(basename "$f"),$(dirname "$f"); fi; done
ex4,test/sample2
ex3,test/sample2
ex2,test/sample1
ex1,test/sample1
2
12.04.2017, 21:42
5 ответов

Мы записываем точки / число, когда встречаемся с соответствующей строкой. Параметр -p будет автоматически печатать строк. Когда мы достигаем eof , мы извлекаем хэш % h и передаем его через фильтр grep , чтобы определить, какие терминалы не печатали, и используем map , чтобы подготовить формат для этого.

perl -lpe 'm|^pts/([0-9])$| and $h{$1}++;
   END{ print for map { "pts/$_" } grep { !$h{$_} } 0 .. 9; }
' /etc/securetty

Мы инициализируем удерживаемое пространство числами 0 1 2 ... 9. Когда мы встречаем строку pts / [0-9] , мы вырезаем это из удерживаемого пространства. . В eof мы получаем удерживаемое пространство, и если какие-либо числа будут найдены, они будут преобразованы в надлежащий формат и распечатаны.

sed -e '
   # initialize the hold space with 0 1 ... 9
   1{x;s|.*|'"$(echo {0..9})"'|;x}

   # whatever be the line, it needs to be printed
   p

   # we meet a valid pts/ line
   \|^pts/[0-9]$|{
      # the hold space gets appended to the pattern space
      G
      # grab what is the pts number and search for it in the hold and
      # delete itand store back the changes into hold space.
      s|^pts/\([0-9]\)\n\(.*\)\1 |\2|;h
   }

   # weve not arrived at the eof and weve processed the input so go no further
   $!d

   # we are at the eof, so we bring back the hold space. just in case all
   # numbers were dealt with up, we simply bail out. Else, prepend the str 
   # pts/ to the numbers present and simply were home
   g;/[0-9]/!d;s/ //g
   s|[0-9]|pts/&\n|g;s/.$//

   # *TIP*: Sprinkle the l, list pattern space at various places to see 
   # whats going on.

' /etc/securetty 
3
27.01.2020, 21:53

sed обрабатывает файл построчно, и очень сложно заставить его «запоминать» любую информацию по строкам.

Вы можете использовать grep , чтобы узнать, содержит ли файл заданный шаблон; с помощью -f вы можете указать несколько шаблонов одновременно. Следующее генерирует полный список pts / 0 .. pts / 9 , затем удаляет шаблоны, уже присутствующие в данном файле, и добавляет оставшиеся в файл:

#!/bin/bash
printf 'pts/%d\n' {0..9} \
| grep -vFf "$1"  - >> "$1".new
mv "$1".new "$1"
0
27.01.2020, 21:53

Удалите любые/все pts/N строки, затем добавьте их обратно:

{ grep -xv '^pts/[0-9]$' /etc/securetty; printf 'pts/%d\n' {0..9}; } > /etc/securetty.new
cat /etc/securetty.new
mv /etc/securetty.new /etc/securetty

Вы также можете сделать это за один раз с помощью вашего любимого инструмента обработки текста, например. ed

ed -s /etc/securetty <<IN
g/^pts\/[0-9]$/d
.r ! printf pts/\%d\\\n {0..9}
,p
q
IN

(замените ,p на w для редактирования на месте) или sed

{ printf '%s\\\n' '$a' pts/{0..8}
printf '%s\n' 'pts/9' '/^pts\/[0-9]$/d'
} | sed -f- /etc/securetty

что практически то же самое, что и обычный

sed '$a\
pts/0\
pts/1\
pts/2\
pts/3\
pts/4\
pts/5\
pts/6\
pts/7\
pts/8\
pts/9
/^pts\/[0-9]$/d' /etc/securetty

(используйте sed с -i для редактирования файла на месте)

1
27.01.2020, 21:53

Добавить одну строку, если ее не хватает, можно, удаляя каждый случай и добавляя ее в конец:

sed -n '/pattern/!p;$a pattern'

Но повторять это для 10 шаблонов неприятно.

sed '/pts\/[0-9]/d;$a pts/0 ...

не получится, если нужно удалить последнюю строку. Так что наоборот, если предположить, что первая строка - единственная, начинающаяся с #:

sed '/#/a pts/0\
pts/1\
pts/2\
pts/3\
pts/4\
pts/5\
pts/6\
pts/7\
pts/8\
pts\9
/pts\/[0-9]/d'

Неприятно. Я предлагаю в этом случае использовать другой инструмент.

1
27.01.2020, 21:53

Вы можете выполнить поиск в файле securetty и добавить недостающие записи следующим образом:

for x in 0 1 2 3 4 5 6 7 8 9
do 
   grep "pts/${x}" /etc/securetty || echo "pts/${x}" >> /etc/securetty
done
sort /etc/securetty -o /etc/securetty
1
27.01.2020, 21:53

Теги

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