У меня есть этот код

sed '/Sometexts/ r newtext.txt' old.txt > new.txt

Это заменяет строку «Sometexts» содержимым текстового файла newtext.txt

но я хочу заменить на 2-е вхождение строки "Sometexts"

Как я могу заархивировать это?

2 ответа2

1

Есть много способов сделать это.

Вероятно, самое простое - преобразовать исходный файл в одну (очень длинную строку), заменив символ новой строки другим символом (я использую 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
1

если решение не ограничено 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
}' 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .