Czy można to zrobić w jednej wkładce?
Mam takie wyjście:
"First line" - Description
" Second line" - Description
"Third line" - Description
" Fourth line" - Description
To wejście jest generowane automatycznie.
Chcę zamienić pierwsze wystąpienie "
(cudzysłów + spacja) na "
(cudzysłów) dla każdego wiersza. Gdybym zastosować podstawienie globalnie, będzie to również zmienić każde wystąpienie line" -
do line"-
, więc zastanawiałem się, czy możliwe jest, aby użyć sed jedną wkładkę do osiągnięcia tego celu.
Próbowałem używać w ^
ten sposób
sed -r ':a;N;$!ba;s/(\^\" )/\"/g'
Ale to nie działa, niczego nie zastępuje. próbowałem
sed -r ':a;N;$!ba;s/(^|\" )/\"/g'
i zastępuje wszystkie wystąpienia. Właśnie zacząłem używać sed, więc tak naprawdę nie wiem, czy robię coś źle.
Czego tu brakuje?
sed
regular-expression
Steve B.
źródło
źródło
sed
, ale dla przenośności i aby uniknąć naprawdę dziwnych błędów, powinieneś zakończyć dany argument polecenia po etykiecie (jeśli w ogóle ich potrzebujesz). Np.sed -e ':a' -e 'N;$!ba' -e 'whatever'
Odpowiedzi:
Przemyślasz to.
sed
domyślnie zastępuje tylko pierwszą instancję w wierszu (bez/g
modyfikatora), chociaż nadal chcesz zakotwiczyć, ponieważ nie chcesz; t tak bardzo chcesz pierwszej instancji w linii, jak tej na początku linii; i zwykle nie potrzebujesz wyraźnych akcji liniowych, których próbujesz użyć (dlaczego?).źródło
sed
polecenia wieloliniowe , takie jakN
i etykiety, takie jak:a
wcale nie są przestarzałe i są przenośne i są zgodne z POSIX , w przeciwieństwie do Perl / Python / Ruby / cokolwiek. Prawdą jest jednak, że jeśli często ich potrzebujesz , powinieneś się uczyćawk
.Bardziej ogólna odpowiedź, ponieważ nie mogę skomentować odpowiedzi geekozaura - nie umieściłbyś ^ (początek linii kotwicy). Na przykład, jeśli chcesz zamienić pierwsze wystąpienie A na B, zrobiłbyś to
źródło