[sed] (voor mij) complexe substitute

Pagina: 1
Acties:
  • 34 views sinds 30-01-2008

  • Sir Isaac
  • Registratie: September 2002
  • Laatst online: 21-05-2025
Ik wil mbv sed de volgende verandering in een lange file aanbrengen:
.\n\foo{bar} moet \foo{bar}.\n worden.
Ik probeer het volgende:
code:
1
sed -e "/\.$/N" -e "s/\.\n\\foo{.*}/bla/"

Met de eerste opdracht pIak ik de regel volgend op een regel die met een punt eindigt aan de voorgaande regel vast.
Daarna probeer ik .\n\begin{<aantal willekeurige karakters>} te veranderen in "bla". Hierbij escape ik de . en de \. Dit werkt niet. Weet iemand waarom?
Verder wil ik hierna "bla" vervangen door een string die onder andere de karakters tussen de accolades bevat. Ik heb lopen experimenteren met \1, maar dat heeft niets opgeleverd.
Hoe moet ik dit aanpakken?

edit:
Ik heb inmiddels gezien dat ik voor foo 3 \ tekens moet zetten. Waarom?

[ Voor 11% gewijzigd door Sir Isaac op 02-06-2004 23:52 ]


  • richardt
  • Registratie: Mei 2002
  • Laatst online: 08-03-2025
Kun je niet gewoon twee substrings groeperen, en die verwisselen?

In jouw voorbeeldje:
substr 1: .\n
substr 2: de rest, dus .*
Een groep maak je, zoals in elke regexp, met (). Als je dit vanuit een shell probeert, is het nodig om deze te escapen, dus \( ... \)

code:
1
2
3
4
5
6
7
# cat foobar.txt
.\n\foo{bar}
.\n\text_zonder_spatie_1{text met spatie 2}

# sed 's/\(\.\\n\)\(.*\)/\2\1/' < foobar.txt
\foo{bar}.\n
\text_zonder_spatie_1{text met spatie 2}.\n

  • Arzie
  • Registratie: Juni 1999
  • Laatst online: 19-02 11:00
Richardt: ik heb het idee dat hij met \n een regeleinde bedoelt.

  • richardt
  • Registratie: Mei 2002
  • Laatst online: 08-03-2025
Ah, dat kon ik er niet helemaal uit opmaken. Ik dacht dat het vervangen van de newlines al was gebeurd.

In dit geval was de TS dus al een aardig eindje op weg:
code:
1
2
3
4
5
6
7
8
9
10
# cat foobar.txt
hello .
world
.
\foo{bar}


# sed '/\.$/N; s/\.\n\(.*\)/\1./' < foobar.txt
hello world.
\foo{bar}.

  • Zwerver
  • Registratie: Februari 2001
  • Niet online
Tja, dit valt onder de noemer scriptrequest, iets wat we liever niet hebben hier...

Lees voordat je een nieuw topic opent ook even de NOS policy - updated 01/04/03 en de FAQ Non-Windows Operating Systems - update: 08/04/2004 door.

Woonachtig Down Under. Ik negeer je insults niet, maar tegen de tijd dat ik ze lees zijn ze meestal niet relevant meer


Dit topic is gesloten.