Zastępowanie ciągu na podstawie numeru wiersza

50

Mam sytuację, w której chcę zastąpić określony ciąg w wielu plikach

Zamień ciąg AAA na inny ciąg BBB, ale istnieje wiele ciągów zaczynających się od AAA lub kończących się na AAA, i chcę zastąpić tylko jeden w wierszu 34 i utrzymać pozostałe nietknięte.

Czy można określić według numeru wiersza, we wszystkich plikach ciąg ten znajduje się dokładnie w 34 wierszu.

krypto
źródło

Odpowiedzi:

82

Możesz podać numer linii w sed lub NR (liczba rekordów) w awk.

awk 'NR==34 { sub("AAA", "BBB") }'

lub użyj FNR (rekord numeru pliku), jeśli chcesz podać więcej niż jeden plik w wierszu poleceń.

awk 'FNR==34 { sub("AAA", "BBB") }'

lub

sed '34s/AAA/BBB/'

zrobić wymianę na miejscu z sed

sed -i '34s/AAA/BBB/' file_name
VanagaS
źródło
-3

załóżmy, że chcesz zastąpić trzeci wiersz w pliku_pliku:

sed -i "s/`head -3 file_record | tail -1 `/replaced/" file_record
RAMAN
źródło
użyj wstecznego cytatu przed głową i po -1 ... tutaj to nie bierze
RAMAN
1
To po prostu nie zadziała. Potrzebuje ciężkiej ucieczki. A jeśli trzecia linia zostanie zduplikowana w innym miejscu?
Sparhawk,