У меня есть этот код
sed '/Sometexts/ r newtext.txt' old.txt > new.txt
Это заменяет строку «Sometexts» содержимым текстового файла newtext.txt
но я хочу заменить на 2-е вхождение строки "Sometexts"
Как я могу заархивировать это?
Есть много способов сделать это.
Вероятно, самое простое - преобразовать исходный файл в одну (очень длинную строку), заменив символ новой строки другим символом (я использую cap ^, потому что в этом контексте он довольно безопасен), выполнив поиск и заменив n-е вхождение вхождения поиск строки, а затем положить новые строки на свое место.
Это можно сделать с помощью одной команды:
tr '\n' '^' < my_file | sed 's/Sometexts/ r newtext.txt/2' | tr '^' '\n' > new.txt
Вы также можете сделать это с помощью awk или одной строки с помощью sed, но это быстро становится беспорядочным.
Редактировать: если вы боитесь использовать ^, вы можете использовать одну команду sed:
sed ':a;N;$!ba;s/Sometexts/ r newtext.txt/2' file
если решение не ограничено sed
, то awk
- ваш друг со следующим подписчиком:
awk 'BEGIN{file="NewText.txt";}{if(/SOMETEX/) count++; if(count==2){while((getline<file)>0) {print};count++;} else print;}' OldText.txt > new.txt
Что оно делает:
awk 'BEGIN{file="NewText.txt";} #sets the path to the
file that will be inserted
{if(/SOMETEX/) count++; #counts occurences of SOMETEX (regex-matching)
if(count==2) #if we just found the second occurence then
{while((getline<file)>0) {print};count++;} #read all lines of
file and print them
else print; #otherwise just print the line
}'