Поиск и замена текста в терминале сценария bash

fc-list FontName file

где FontNameточное имя шрифта, найденное с

fc-list | grep -i approximate-or-partial-font-name

-1
11.04.2021, 10:11
5 ответов
awk 'BEGIN {RS=ORS="\n\n"};
     /^info {/ { gsub("}","work day4\nwork day5\nwork day8\n}") };
     /^work {/ { gsub("}","Absent No\n}") };
     1' info.txt 

Это говорит awk читать входной файл по абзацу за раз (т. е. записи разделяются двумя символами новой строки, а не только одной, путем установки разделителя входных записей RSна\n\n). Он также устанавливает разделитель выходных записей таким же, как RS, так что выходные данные также содержат пустую строку между записями.

Затем он использует функцию gsub()для добавления дополнительной строки (s )непосредственно перед }в конце каждого соответствующего абзаца (тех, которые начинаются с «info {» или «work { ). На самом деле, заменяет на }в конце этих записей дополнительными строками и на }-, что фактически то же самое, что и вставка дополнительных строк.

Окончательный 1является сокращением awk для printи печатает каждую запись независимо от того, была ли она изменена или нет.

2
28.04.2021, 22:53

Сperl:

perl -0777 -pi -e '
  s{^info\s*\{.*?\K(?=\})}{join "", map {"work day$_\n"} 4,5,8}mse;
  s{^work\s*\{.*?\K(?=\})}{Absent No\n}ms' /home/count/1/details/info.txt
2
28.04.2021, 22:53

Также с awkв режиме абзаца вы можете попробовать этот код:


awk -v s1="Absent No\n" -v s2="work day4\nwork day5\nwork day8\n"  -v OFS="\n" -v RS= -v ORS='\n\n' '$1 == "work" {sub(/}/, s1"&")} $1 == "info" {sub(/}/, s2"&")} 1' file
title1 {
key1 value1
key2 value2
key3 value3
}

info {
name1 text
post1 anything
salary 1
work day1
work day2
work day3
work day4
work day5
work day8
}

work {
department sell
store ground
remarks
Absent No
}

contact {
required No
}
1
28.04.2021, 22:53

Использование GNU awk для многосимвольных -char RS и RT и выполнение сопоставления и замены буквенных строк:

$ awk -v RS='}\n+' -v ORS= '
    $1 == "info" { $0 = $0 "work day4\nwork day5\nwork day8\n" }
    $1 == "work" { $0 = $0 "Absent No\n" }
    { print $0 RT }
' file
title1 {
key1 value1
key2 value2
key3 value3
}

info {
name1 text
post1 anything
salary 1
work day1
work day2
work day3
work day4
work day5
work day8
}

work {
department sell
store ground
remarks
Absent No
}

contact {
required No
}
1
28.04.2021, 22:53
sed -i -e '
  /^info {/,/}/ s/}/work day4\nwork day5\nwork day8\n&/

  /^work {/,/}/ s/}/Absent No\n&/
' /home/count/1/details/info.txt

perl -i -lpe '
  /^info \{/.../}/ and /}/ && do{
  print for map { "work day$_" } 4,5,8}; 

  /^work \{/.../}/ and /}/ &&
    print "Absent No";
' /home/count/1/details/info.txt
0
28.04.2021, 22:53

Теги

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