Я прикрепил файл .cfg.

BK = 2
CM = 2
LEF_M1_NAME = "ME1"
LEF_M2_NAME = "ME2"
LEF_M3_NAME = "ME3"
LEF_M4_NAME = "ME4"
LEF_M5_NAME = "ME5"
NB = 144
NW = 256
viewselect = {
              "alf"
              "allpvt"
              "allpvthtml"
              "atpg_netlist"
              "clp"
              "coord"
              "core"
              "cpf"
              "ctl"
              "dssum"
              "fast_func_verilog"
              "fastscan"
              "frontend_gds"
              "gds"
              "ikos"
              "lvlib"
              "masis"
              "verilog_vhd_stim"
              "chd_rtl"
             }

Теперь мне нужно добавить строку component $c set_parameter в начале каждой строки, используя команду sed в Linux, за исключением того, где в начале есть пробел, например alf, allpvt с пробелом в начало, и я не хочу добавлять туда строку component $c set_parameter. Может ли кто-нибудь помочь мне с синтаксисом команды sed?

Я использовал приведенную ниже команду sed, которая печатает component $c set_parameter во всех строках.

sed -i -e 's/^/  component $c set_parameter /' a.cfg

Вывод команды, как показано ниже

component $c set_parameter BK 2
component $c set_parameter CM 2
component $c set_parameter LEF_M1_NAME ME1
component $c set_parameter LEF_M2_NAME ME2
component $c set_parameter LEF_M3_NAME ME3
component $c set_parameter LEF_M4_NAME ME4
component $c set_parameter LEF_M5_NAME ME5
component $c set_parameter NB 144
component $c set_parameter NW 256
component $c set_parameter viewselect = {
component $c set_parameter               alf
component $c set_parameter               allpvt
component $c set_parameter               allpvthtml
component $c set_parameter               atpg_netlist
component $c set_parameter               clp
component $c set_parameter               coord
component $c set_parameter               core
component $c set_parameter               cpf
component $c set_parameter               ctl
component $c set_parameter               dssum
component $c set_parameter               fast_func_verilog
component $c set_parameter               fastscan
component $c set_parameter               frontend_gds
component $c set_parameter               gds
component $c set_parameter               ikos
component $c set_parameter               lvlib
component $c set_parameter               masis
component $c set_parameter               mask
component $c set_parameter               oasis
component $c set_parameter               params
component $c set_parameter               plef
component $c set_parameter               power_verilog

Но я не хочу, чтобы строка component $c set_parameter присутствовала в начале alf, allpvt и т. д. во всех местах, где она находится в начале.

Я просто хочу напечатать строку component $c set_parameter только там, где в начале нет пробелов.

0
Roman Riabenko 24 Сен 2021 в 11:08

1 ответ

Найдите любую строку, которая не начинается с символа пробела (используя ^ в классе символов для отрицания). Для любого совпадения замените начало строки текстом «компонент».

/^ поиск с начала строки

[^ .. ] это класс символов, ^ отрицает содержимое класса.

[:space:]+ класс символов - пробел или символ табуляции

[^[:space:]]+, но класс инвертирован, поэтому ищите с начала строки хотя бы один непробельный символ. (+ означает по крайней мере одно появление непробельного символа).

Если найдено совпадение в регулярном выражении /.../, выполните следующую замену - в начале строки (^ означает начало строки) добавьте текст "component...".

sed -E '/^[^[:space:]]+/ s/^/component $c set_parameter/' a.cfg
0
suspectus 5 Окт 2019 в 20:22
Привет! Не могли бы вы сообщить мне, что он ищет, используя "^[^[:space:]]+/ " ?
 – 
Lalitkumar
5 Окт 2019 в 19:08
Спасибо, что поделились этой командой
 – 
Lalitkumar
5 Окт 2019 в 19:08
Обновлю сообщение, чтобы объяснить команду sed. Если этот пост решил вашу проблему, рассмотрите возможность его принятия.
 – 
suspectus
5 Окт 2019 в 20:14