Замініть на N-е виникнення


0

У мене є цей Кодекс

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

Це замінює рядок "Sometexts" вмістом текстового файлу newtext.txt

але я хочу замінити на друге виникнення рядка 'Sometexts'

Як я можу це архівувати?

Відповіді:


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
}' 

1

Існує багато способів зробити це.

Напевно, найпростішим є перетворення початкового файлу в єдиний (дуже довгий рядок), замінивши новий рядок на інший символ (я використовую cap ^, оскільки це досить нешкідливо в цьому контексті), шукаючи та замінюючи n-е виникнення шукати рядок, а потім повертати нові рядки на їх місце.

Це можна зробити за допомогою однієї команди:

 tr '\n' '^' < my_file | sed 's/Sometexts/ r newtext.txt/2' | tr '^' '\n' > new.txt

Ви також можете зробити це з awk, або на одній лінії з sed, але це швидко стає безладним.

Редагувати: якщо ви боїтесь використання ^, ви можете використовувати цю команду:

 sed ':a;N;$!ba;s/Sometexts/ r newtext.txt/2' file

якщо my_fileміститься який-небудь власний '^', це буде обробляти файл додатковими новими рядками ...
Legionair

@Legionair ви можете використовувати інший символ або використовувати новий товариш, який я додав у редагуванні до своєї відповіді.
MariusMatutiae

Виникла проблема, яка замінює "newtext.txt" як рядок замість тексту з newtext.txt ????
The KingMaker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.