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 vzorup
:tisk předchozího řádkud
: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.