GNU/Linux >> Znalost Linux >  >> Linux

Vytisknout předchozí řádek po shodě vzoru pomocí Sed?

Chci vytisknout předchozí řádek pokaždé, když byla nalezena shoda. Vím o grep -A a -B možnosti. Ale můj počítač Solaris 5.10 tyto možnosti nepodporuje.

Chci řešení pouze pomocí sed .

Foo.txt :

Name is : sara
age is : 10
Name is : john
age is : 20
Name is : Ron
age is : 10
Name is : peggy
age is : 30

Out.txt :

Name is : sara
Name is : Ron

Vzor, který se snažím najít, byl age is : 10 .

Moje prostředí, Solaris 5.10.

Přijatá odpověď:

$ sed -n '/age is : 10/{x;p;d;}; x' Foo.txt 
Name is : sara
Name is : Ron

Výše uvedené bylo testováno na GNU sed. Pokud Solaris sed nepodporuje řetězení příkazů spolu se středníky, zkuste:

$ sed -n -e '/age is : 10/{x;p;d;}' -e x Foo.txt 
Name is : sara
Name is : Ron

Jak to funguje

sed má úložný prostor a prostor vzoru. Nové řádky se načtou do prostoru vzoru. Myšlenkou tohoto skriptu je, že předchozí řádek je uložen v úložném prostoru.

  • /age is : 10/{x;p;d;}

    Pokud aktuální řádek obsahuje age is : 10 , pak proveďte:

    x :prohoďte vzor a podržte místo tak, aby předchozí řádek byl v prostoru vzoru

    p :tisk předchozího řádku

    d :vymažte prostor se vzorem a začněte zpracovávat další řádek

  • x

    Toto se provádí pouze na řádcích, které neobsahují age is : 10 . V tomto případě uloží aktuální řádek do úložného prostoru.

Opak

Předpokládejme, že chceme vytisknout jména lidí, jejichž věk ne je 10:

$ sed -n -e '/age is : 10/{x;d}' -e '/age is :/{x;p;d;}' -e x Foo.txt 
Name is : john
Name is : peggy

Výše uvedené přidává na začátek příkaz, /age is : 10/{x;d} , ignorovat osoby ve věku 10 let. Následující příkaz /age is :/{x;p;d;} , nyní přijímá všechny zbývající věkové skupiny.


Linux
  1. Shoda víceřádkového vzoru pomocí Sed, Awk nebo Grep?

  2. Najít číslo řádku, které obsahuje vzor, ​​pomocí vlastního oddělovače regulárního výrazu?

  3. Nahrazení vzoru po N-té shodě se najde na každém řádku?

  1. Vrátit pouze část řádku po odpovídajícím vzoru?

  2. Uložit soubor po použití příkazu Sed?

  3. Vložit více řádků do souboru po zadaném vzoru pomocí shell skriptu

  1. Bash - Jak tisknout víceřádkové řetězce (s '\n') pomocí printf

  2. Jak vložím text do 1. řádku souboru pomocí sed?

  3. Použití sed k nahrazení mezi konkrétním vzorem