Переименование в sed для дальнейшего сопоставления перед заменой

В зависимости от того, какой дистрибутив вы используете, в вашем безопасном журнале или журнале аудита должны быть указаны полные данные для входа в систему. Это простое быстрое исправление, позволяющее проверить, существуют ли они в /etc/passwd, но у вас могут возникнуть проблемы с повторяющимися именами пользователей.

0
22.05.2020, 21:02
3 ответа

Необходимо повторно -упорядочить renamefileпо длине, чтобы сначала заменить более длинные имена

awk '{ print length, $0 }' renamefile| sort -nr | cut -d" " -f2- > renamefile2

выход

s/\<Strawberry juice with lemon\>/3076/g
s/\<Orange juice with pulp\>/3072/g
s/\<Apple juice with lemon\>/3075/g
s/\<Watermelon juice\>/3074/g
s/\<Orange juice\>/3073/g
s/\<Apple juice\>/3071/g

Тогда вы можете без проблем подать заявку.

sed -f renamefile2 fileA

Описание:

awkциклы по линиям

  • length— это встроенный -в функции awk. при вызове без аргумента будет напечатан размер текущей строки (больше информации в длина awk)
  • $0текущая строка

Следующая команда напечатает длину каждой строки рядом с самой строкой

awk '{ print length, $0 }' renamefile

24 s/\<Apple juice\>/3071/g
35 s/\<Orange juice with pulp\>/3072/g
25 s/\<Orange juice\>/3073/g

sortсортирует введенный текст

  • -nбудет сортировать численно
  • -rинвертировать результат, чтобы сделать его нисходящим.

cutвыберет часть текста (, так как нам не нужна длина в окончательном скрипте и нужно выбрать только sedчасть строк)

  • -d" "указывает разделитель, который здесь space.
  • -f2-от поля 2 до конца строки
1
18.03.2021, 23:34

С awk проще:

$ cat tst.awk
BEGIN {
    id = 3071
    map["Apple juice"]                  = id++
    map["Orange juice with pulp"]       = id++
    map["Orange juice"]                 = id++
    map["Watermelon juice"]             = id++
    map["Apple juice with lemon"]       = id++
    map["Strawberry juice with lemon"]  = id++
}
match($0,/^((\S+\s+){3})(.*\S)((\s+\S+){2})/,a) {
    $0 = a[1] map[a[3]] a[4]
    print
}

$ awk -f tst.awk file
AB12345    100    0    3071 20/05   AB
CD67890    150    0    3072 22/05   CS
EF25879    100    0    3074 19/05   CG
GH96314    98    0    3073 20/05   PU
IJ74123    95    0    3076 17/05   ST

В приведенном выше примере используется GNU awk, поскольку вы использовали GNU sed для границ слов \<и \>.

0
18.03.2021, 23:34

Используя GNU sed, мы сначала изменяем файл переименования динамически (, что означает, что вам не нужно делать какие-либо ручные изменения в нем ), а затем используем это как код sed для выполнения редактирования в файле A

Изменение, которое мы делаем в файле переименования, состоит в том, чтобы искать новую строку как правую границу, а не \>. Но перед этим мы вставляем новую строку в пространство шаблонов файла A.

$ sed -re '
     1i\
s/(\\s+\\S+){2}\\s*$/\\n&/
     s/\\>/\\n/
' renamefile | sed -rf - fileA

Выход:

AB12345    100    0    3071 20/05   AB
CD67890    150    0    3072 22/05   CS
EF25879    100    0    3074 19/05   CG
GH96314    98    0    3073 20/05   PU
IJ74123    95    0    3076 17/05   ST
0
18.03.2021, 23:34

Теги

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