Otra forma de evitar el problema de división de palabras aquí es:
set | grep -w IFS=
que genera el IFS predeterminado como
IFS=$' \t\n'
Consulte esta publicación relacionada en Stack Overflow:
Вы можете указать условие в виде, например, шаблона поиска:
sed -i -r '/^10?:/ {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt
Замены выполняются, только если строка начинается с 1:
или 10:
. Это результат:
1:module counter ( clk, reset, enable, dat_out );
4: input clk, [-reset ;-] {+reset, enable;+}
5: wire {+N69, N70, N71,+} N72, N73, N74, N75, N76, N77, N78, N79, N80,
10: EDFFX2AD \dat_out_sig_reg[0] ( .D(N69),.E(N96),.CK(clk),.Q(dat_out[0])
12: EDFFX2AD \dat_out_sig_reg[1] ( {+.D(N70),+}.E(N94),.CK(clk),.Q(dat_out[1])
14: EDFFX2AD \dat_out_sig_reg[2] (.D(N71), [-.E(synopsis_unconnected),-] {+.E(N92),+}.CK(clk),.Q(dat_out[2])
Условие может быть в номерах строк :это будет обрабатывать только первую строку:
sed -i -r '1 {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt
Поскольку вы упомянули Perl, вы можете предпочесть использовать следующее:
perl -i -pe 'if (/^10?:/) {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt
или:
perl -i -pe 'if ($.==1 or $.==10) {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt
Вы можете добавить строку или диапазон перед командой sed
.
Для вашего первого примера вы можете попробовать 3-ю строку, которая пронумерована как #4:
sed "3 s/{+//" error.txt
Или, если вам нужен скрипт, вы можете поработать над этим фрагментом:
#!/bin/bash
echo -e "Usage:\t./my_sed.sh linenumber file\n"
sed "$1 s/{+//" $2