Я хочу заменить строки в файле. т.е. если "старый текст" находится в файле в начале строки, замените всю строку на "новый текст".

Начало строки может быть ^oldtext или oldtext с отступом некоторым пробелом / табуляцией

grep "^[\S]oldtext" myfile.txt   # doesn't work

Мне нужно рассчитать тот же уровень отступа, что и в "oldtext"

prefixspaces = <number of spaces before the "mytext", converting tabs to 4 spaces>

Я понимаю, что sed, возможно, лучший способ добиться этого, но мне каким-то образом нужно сначала вычислить пространство префиксов, тогда мой результат будет примерно таким:

sed -i -e 's/^$prefixspaces$newtext*$/$prefixspaces$newtext/g' myfile.txt

Не могу понять, как это рассчитать. Может быть, $prefixspace можно поместить в группу () или что-то в этом роде, чтобы sed мог легко вычислить и работать с ним? Возможно, это однострочный sed или awk, но после некоторых поисков я не могу с этим справиться.

2
YorSubs 15 Ноя 2020 в 11:08

2 ответа

Лучший ответ

Как это:

sed 's/^\( *\)oldtext.*/\1newtext/' file

Пояснение:

< EM> Поиск

^             beginning of the line
\( *\)        capture 0 or more spaces in group 1
oldtext       'oldtext'
.*            rest of the line

заменить

\1            the 0 or more spaces from group1
newtext       'newtext'
3
hek2mgl 15 Ноя 2020 в 10:35

Это может сработать для вас (GNU sed):

sed '/^\s*oldtext/s/\S.*/newtext/' file

Соответствует oldtext в начале строки или с отступом и заменяет первый символ, не являющийся пробелом.

1
potong 15 Ноя 2020 в 14:33