Chcę znaleźć ciąg w wierszu tekstu i wydrukować ciąg (między spacjami) i pierwsze słowo frazy.
Na przykład:
„To jest pojedyncza linia tekstu” "Inna rzecz" „Lepiej spróbuj ponownie” "Lepszy"
Lista ciągów to:
tekst rzecz próbować Lepszy
Próbuję uzyskać taki stół:
Ten [tab] tekst Kolejna rzecz [tab] To [tab] próbuje Lepszy
Próbowałem z grepem, ale nic się nie wydarzyło. Jakieś sugestie?
command-line
text-processing
regex
Felipe Lira
źródło
źródło
Odpowiedzi:
Wersja Bash / grep:
Nazwij to tak:
Wynik:
źródło
Perl na ratunek!
Zapisz jako
first-plus-word
, uruchom jakoTworzy regex ze słów wejściowych. Każda linia jest następnie dopasowywana do wyrażenia regularnego, a jeśli występuje dopasowanie, drukowane jest pierwsze słowo, a jeśli jest inne niż słowo, słowo jest również drukowane.
źródło
Oto wersja awk:
gdzie
file2
jest lista słów ifile1
zawiera wyrażenia.źródło
Oto wersja python:
Próbny:
Uwaga dodatkowa : skrypt jest
python3
zgodny, więc możesz go uruchomić za pomocą jednegopython2
lub dwóchpython3
.źródło
Spróbuj tego:
Jeśli karta przed
Better
znakiem stanowi problem, spróbuj wykonać następujące czynności:Powyższe zostało przetestowane na GNU sed (nazywane
gsed
na OSX). W przypadku BSD sed konieczne mogą być niewielkie zmiany.Jak to działa
s/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/
To szuka słowa,
[[:alnum:]]+
po którym następuje spacja,[[:space:]]
po którym następuje cokolwiek.*
, po którym następuje jedno z twoich słówtext|thing|try|Better
, a po nim cokolwiek. Jeśli zostanie znaleziony, zostanie zastąpiony pierwszym słowem w linii (jeśli istnieje), tabulatorem i dopasowanym słowem.ta; b; :a; s/^\t//; p
Jeśli polecenie podstawienia spowodowało podstawienie, co oznacza, że jedno z twoich słów zostało znalezione w wierszu, to
ta
polecenie każe sedowi przejść do etykietya
. Jeśli nie, to rozgałęziamy (b
) do następnej linii.:a
określa etykietę a. Tak więc, jeśli jedno z twoich słów zostało znalezione, my (a) dokonujemy podstawienia,s/^\t//
które usuwa wiodącą kartę, jeśli istnieje, i (b) drukujemy (p
) wiersz.źródło
Proste podejście bash / sed:
while read w; do ...; done < words
Będzie iteracyjne nad każdą linię w plikuwords
i zapisać go jako$w
. Te-n
markised
niczego domyślnie nie drukuje.sed
Komenda wtedy, zastąpi cudzysłowów stosowane przez nie-białych znaków (\"(\S*)
, nawiasy służyć do „przechwytywania” co jest dopasowane\S*
, pierwsze słowo, a my możemy później o nim jako o\1
), 0 lub więcej znaków (.*
), a następnie szukane słowo ($w
) i ponownie 0 lub więcej znaków (.*
). Jeśli to pasuje, zastępujemy je tylko pierwszym słowem, tabulatorem i$w
(\1\t$w
), i wypisujemy wiersz (to właśnie robip
ins///p
).źródło
To jest wersja Ruby
Przykładowy plik tekstowy
hello.txt
zawieraUruchamianie z
ruby source.rb hello.txt
wynikami wźródło