Vraag Sed gebruiken om tekst toe te voegen aan een bestand voor en na het woord


Ik heb een bestand met woorden, één woord per regel, dat ik nu wil wijzigen, zodat het een .sh-bestand wordt met een egrep-zoekreeks voor elk woord. De zoekreeks die ik uiteindelijk wil ziet er zo uit:

`egrep -wi '\|WORD\.\.nn' stats_all.txt > WORD_frekvens.txt`

Mijn word-bestand ziet er als volgt uit:

$ more -10 word_file.txt
anakonda
ord
tröja
bord
glas
pension
larm
risk
försening
rapport

Ik heb geprobeerd om dit te doen met de volgende tekenreeks:

sed -e 's/\(.*\)/egrep -wi '\''\\|\1\\.\\.nn'\'' stats_all.txt > \1_frekvens.txt/' word_file.txt | more

Maar het geeft de output:

_frekvens.txt_all.txt > WORD

Waarom werkt het niet om het te gebruiken \1 hier? Het lijkt dit deel te zijn dat het probleem is, omdat het werkt als ik het voor een woord ruil.

Alles wat ik schrijf na \1 eindigt met schrijven over de inhoud van \1, d.w.z. "WORD". Als ik iets eerder schrijf \1 Het werkt goed.

Zeer dankbaar voor alle hulp.


1
2018-06-01 11:12


oorsprong


Ik denk dat de bewerking van @ Ron de fout heeft gecorrigeerd, is het niet? het origineel had niet-ontsnapte haakjes rond de vanggroep d.w.z. (.*) in plaats van \(.*\): de eerste vereist -r of -E modus (basic sed behandelt haakjes als letterlijk). - steeldriver
Bedankt. Maar nee, ik ben bang van niet. Ik heb de zoekopdracht gedaan met \(.*\) al die tijd (ik weet niet waarom het in mijn vraag niet is geëlimineerd ...). Nog steeds lijkt het een probleem te zijn. - Ingrid
Wat is jouw schelp? - A.B.
Ik gebruik Ubuntu via VirtualBox (als dit een shell is). - Ingrid
Voeg de uitvoer toe van echo $SHELL - A.B.


antwoorden:


U kunt uw woordenlijst ook met het volgende verwerken perl opdracht:

$ perl -ne 's/\s*$//; print "egrep -wi \047\|${_}\.\.nn\047 stats_all.txt > ${_}_frekvens.txt\n"' word_file.txt

Merk op dat ik gebruik \047 om ontsnappen te voorkomen ' (alleenstaande citaat).

Met een dummy word_file.txt:

foo
bar

De uitvoer is:

egrep -wi '\|foo\.\.nn' stats_all.txt > foo_frekvens.txt
egrep -wi '\|bar\.\.nn' stats_all.txt > bar_frekvens.txt

1
2018-06-01 12:07



Je hebt een nodig \  voor de . : `egrep -wi '\|WORD\.\.nn' stats_all.txt > WORD_frekvens.txt` - A.B.
@ A.B. Inderdaad, bedankt - Sylvain Pineau
Ik heb je voorbeelduitvoer gewijzigd, ik hoop dat het goed is. En een +1 =) - A.B.
Bedankt. Ik krijg echter deze output: _frekvens.txtll.txt > WORD. Enig idee wat ik verkeerd doe? Iets te maken met de Ubuntu / Perl-versie ?? Ik begrijp dat er verschillende instellingen voor RegExs kunnen zijn? Misschien heeft dit er iets mee te maken? (Zoals je ziet, ben ik niet erg gewend om in de terminal te werken.) - Ingrid
Oh wauw, bedankt! Ja, dat was het antwoord! Had geen idee dat de regeleinden verschillend waren in Windows. Maar geweldig! Bedankt jullie allemaal! Alle oplossingen zouden geweldig werken als ik het woordbestand alleen in Linux had gemaakt ... @ A.P. - Ingrid


Het volgende commando:

sed -e "s/\(.*\)/\`egrep -wi '\\\|\1\\\\.\\\.nn' stats_all.txt > \1_frekvens.txt\`/" word_file.txt

geeft de output:

`egrep -wi '\|anakonda\.\.nn' stats_all.txt > anakonda_frekvens.txt`
`egrep -wi '\|ord\.\.nn' stats_all.txt > ord_frekvens.txt`
`egrep -wi '\|tröja\.\.nn' stats_all.txt > tröja_frekvens.txt`
`egrep -wi '\|bord\.\.nn' stats_all.txt > bord_frekvens.txt`
`egrep -wi '\|glas\.\.nn' stats_all.txt > glas_frekvens.txt`
`egrep -wi '\|pension\.\.nn' stats_all.txt > pension_frekvens.txt`
`egrep -wi '\|larm\.\.nn' stats_all.txt > larm_frekvens.txt`
`egrep -wi '\|risk\.\.nn' stats_all.txt > risk_frekvens.txt`
`egrep -wi '\|försening\.\.nn' stats_all.txt > försening_frekvens.txt`
`egrep -wi '\|rapport\.\.nn' stats_all.txt > rapport_frekvens.txt`

1
2018-06-01 16:12





Zoals het is gebleken, gebruik je Windows-regeleinden (\r\n) in het bestand. Vanwege dit feit heb ik mijn commando's aangepast, let op de … gsub(/\r/,"") …

Dit is een eenvoudige taak voor awk:

awk 'gsub(/\r/,"") {print "`egrep -wi \047\\|" $_ "\\.\\.nn\047 stats_all.txt > "$_"_frekvens.txt`"}' <your_input_file>

om de uitvoer in de te schrijven invoer het dossier:

awk -i inplace 'gsub(/\r/,"") {print "`egrep -wi \047\\|" $_ "\\.\\.nn\047 stats_all.txt > "$_"_frekvens.txt`"}' <your_input_file>

om de uitvoer in een nieuw bestand te schrijven:

awk 'gsub(/\r/,"") {print "`egrep -wi \047\\|" $_ "\\.\\.nn\047 stats_all.txt > "$_"_frekvens.txt`"}' <your_input_file> > output_file

Voorbeeld met inline-bewerking

% cat words
foo
bar

% awk -i inplace 'gsub(/\r/,"") {print "`egrep -wi \047\\|" $_ "\\.\\.nn\047 stats_all.txt > "$_"_frekvens.txt`"}' words

% cat words                                                                                               
`egrep -wi '\|foo\.\.nn' stats_all.txt > foo_frekvens.txt`
`egrep -wi '\|bar\.\.nn' stats_all.txt > bar_frekvens.txt`

1
2018-06-01 14:52



Dit lijkt een goede oplossing, maar om de een of andere reden werkt dit ook niet. Ik krijg op de een of andere manier hetzelfde soort probleem als eerder. De uitvoer is: _frekvens.txt_all.txt > WORD. Ik moet iets verkeerds doen, maar kan niet achterhalen wat het is ... - Ingrid
@Ingrid Welke uitvoer? =) - A.B.
Sorry, ik ben hier niet helemaal aan gewend, dus stuurde ik het te vroeg op .. :) - Ingrid
Wat is de inhoud van uw invoerbestand? - A.B.
@Ingrid Wat is de inhoud van uw invoerbestand? - A.B.