Wstawianie zmiennej do komendy sed w skrypcie bash

0

Mam plik tekstowy podobny do tego:

Some-text
Keyword
Some-text
Some-text
Keyword
Some-text
Keyword
Keyword

Chcę zastąpić każde „Słowo kluczowe” ciągiem „liczba.rozszerzenie”, gdzie liczba to 1 przy pierwszym dopasowaniu słowa kluczowego, 2 przy drugim dopasowaniu słowa kluczowego itp.

Wiem, że powinienem używać pętli bash w połączeniu z sed (sed: słowo kluczowe: liczba: g '), ale nie jestem pewien, jak wstawić zmienną dla liczby w tym poleceniu sed.

Ponieważ jest to plik HTML, pomiędzy tymi „słowami kluczowymi” mogą znajdować się puste linie lub dowolny tekst.

Rafał
źródło

Odpowiedzi:

1

Czy to robi co chcesz?

perl -pe '$n++ if /Some-text/;s/Keyword/SomeText '\''$n'\''/'

W przypadku bardziej skomplikowanych zamian (np. W przypadku matematyki) bardziej odpowiedni może być bardziej zaawansowany język skryptowy.

choroba
źródło
Dzięki, ale nie ładuje żadnego pliku i (o ile widzę) jest to bardzo ważne. Czy możesz wyjaśnić, jak to ma działać?
Rafał
@Rafal: Po prostu dodaj ścieżkę do pliku jako ostatni argument lub przekieruj (potok) do skryptu. -pPrzełącznik automatycznie ładuje plik.
choroba
Twój oryginalny skrypt nic nie robi z moim plikiem. Myślę, że nie miałem jasności co do tego, czego potrzebuję. Kiedy zamieniam „Some-text” na „. *?” a po drugie z odniesieniem „\ 1” zmienia słowo kluczowe na liczbę wierszy. Zmodyfikowałem go, aby zrobić dokładnie to, czego potrzebuję: 'perl -pe' $ n ++ if / MYLONGKEYWORD /; s / MYLONGKEYWORD / $ n / 'example-input.html'. Dziękuję za pomoc!
Rafał
2

Edytowane: Możesz użyć zmiennej w sed w następujący sposób,

count=1
extension=".jpg"
cp yourfile tempfile
for (( i=1; i<=`wc yourfile | awk '{ print $1 }'`; i++))
do

#for (( j=1; j<=`sed -n ''"$i"' p' yourfile | wc | awk '{ print $2 }'`; j++))
#do
        sed -i ''"$i"' s/[a-zA-Z0-9]*[Kk][Ee][Yy][Ww][Oo][Rr][Dd]/'"$count$extension"'/1' yourfile
        diff yourfile tempfile
        if [ $? -ne 0 ]
        then    
        count=$(expr $count + 1)
        cp yourfile tempfile
        fi  
#done
done
sm
źródło
Dziękuję, ale niestety nie robi tego, czego potrzebuję. Zaktualizowałem pytanie, aby było bardziej jasne. Ten tekst pomiędzy słowami kluczowymi może być bardzo różny. Chcę tylko zastąpić każde wystąpienie mojego słowa kluczowego rosnącą liczbą i rozszerzaniem plików. Przykładowe pliki HTML tutaj dropbox.com/s/qinykn154nhjymu/example.zip
Rafal