Вот несколько вариантов использования perl.
Поскольку вы сопоставляете только один символ, вы можете использовать tr/C//
(перевод без замены), чтобы вернуть количество совпадений C
:
perl -lne 'print if tr/C// != 1' file
В более общем случае, если вы хотите сопоставить многосимвольную строку или регулярное выражение, вы можете использовать это:
perl -lne 'print if (@m = /C/g) != 1' file
Это присваивает совпадения регулярного выражения /C/g
list @m
и выводит строки, если длина этого списка не равна 1
.
Переключатель -i
можно добавить для редактирования «на месте».
sed -i "/nfin=[0-9]/{s//&\n/;P;d;}" sample_text
удалит остаток строки после nfin=[0-9]
Для строки (строк) с nfin=[0-9]
:
\n
ewline после шаблона (&
)P
rint строка перед \n
ewlined
elete строка (печатать больше)sed -ne 's/[ ]nfin=[^ ]*/&\n/;P' < your_spice_netlist
Но вы должны иметь в виду, что списки соединений spice могут иметь экземпляры ('x') или, если на то пошло, любые границы элементов, пересекающие линии, и в таком сценарии приведенный выше код sed может не работать, поскольку, возможно, параметр nfin может находиться в начале строка типа as, + nfin = 23. Кроме того, иногда "nfin" может отображаться параметризованным, например, nfin = 'width * 0.5 + 1./nfac*len', в результате чего nfin = [0-9] не будет соответствовать.
Однако, если вы можете быть уверены, что мультилиний отсутствуют (по крайней мере, в некоторых случаях), то все вышесказанное должно работать надежно. Также не должно быть вкладок.
Попробуйте вместо этого sed
:
sed -E 's/ pdej.*$//'
Пример:
sed -E 's/ pdej.*$//' file.txt
xxsac00mi126 vddai:f1042 tkeept_iph xsac00.f1040 vdda lvtpfet m=1 nf=1 nfin=2
Где file.txt
содержит:
cat file.txt
xxsac00mi126 vddai:f1042 tkeept_iph xsac00.f1040 vdda lvtpfet m=1 nf=1 nfin=2 pdej=1.6e-07 asej=3.2e-16 lrsd=4e-08 pre_layout_local=0
ИЛИ:
Если вы хотите (нужно) использовать nfin
в качестве своего рода привязки, используйте:
sed -E 's/(.*nfin=[0-9]).*/\1/' file.txt
xxsac00mi126 vddai:f1042 tkeept_iph xsac00.f1040 vdda lvtpfet m=1 nf=1 nfin=2