
Мне нужно добавить новую строку после первой />
для всех файлов в каталоге.
Вот мой сценарий:
#!/bin/bash
find ./ -type f -print0 | while IFS= read -r -d '' myfile; do
sed -i '0,/\/>/asome text here' $myfile
done
Однако, похоже, что все из \n
также совпадают. Например, если файл выглядит так:
abc
def
<abc/>
<abc/>
После выполнения моего скрипта я получу следующий результат:
abc
some text here
def
some text here
<abc/>
some text here
<abc/>
Он добавляет новую строку для первого вхождения />
, но он также добавляет новую строку для каждой строки перед первой />
.
решение1
Да. Выражение 0,/regex/
приведет к тому, что следующая за ним команда ( a
) будет применена квсе строкидо (и включая) первого совпадения регулярного выражения.
Я предполагаю, что вместо этого вы бы хотели сделать
sed -i '0,/regex/{//a text
}' "$myfile"
Это позволит выбрать все строки до первого совпадения с регулярным выражением, а затем применить команду только к той строке в этом диапазоне, которая соответствует выражению, при этом все остальные строки будут пропущены без изменений.
Буквальный символ новой строки необходим для обозначения конца добавляемого вами текста.