/ / Zbavte sa reťazcov obsahujúcich vzor v súbore - linux, awk, sed, grep

Zbavte sa reťazcov obsahujúcich vzor v rámci súboru - linux, awk, sed, grep

V rámci linuxového súboru s nasledujúcim obsahom sa chcem zbaviť všetkého počnúc konkrétnym vzorom, ktorým je aws: v tomto konkrétnom prípade:

aws:cloudformation:logical-id="somestring" Name="abc" Product="xyz" Role="www" aws:autoscaling:groupName="strings-and-numbers-012345" aws:cloudformation:stack-id="strings-and-numbers-012345" aws:cloudformation:stack-name="strings-and-numbers-012345"

Výstup, ktorý potrebujem, je len: Name="abc" Product="xyz" Role="www"; ako to spravím?

odpovede:

1 pre odpoveď č. 1
awk "{print $2,$3,$4}" file

Name="abc" Product="xyz" Role="www"

0 pre odpoveď č. 2

Čo tak

sed "s/aws:[^ ]*//g" filename

0 pre odpoveď č. 3

V awk:

$ awk "{for(i=1;i<=NF;i++)if($i!~/^aws:/)b=b(b==""?"":OFS)$i;print b;b=""}" file
Name="abc" Product="xyz" Role="www"

vysvetľuje:

{
for(i=1;i<=NF;i++)             # iterate over every field
if($i!~/^aws:/)            # if it doesn"t start start with aws:
b=b (b==""?"":OFS) $i  # buffer it to b with OFS
print b                        # never stop iterating till the iterating is done and output
b=""                           # reset buffer
}

Nevýhodou je, že vypíše prázdny riadok, ak každé pole začína znakom aws:. Tomu sa vyhnite if(b!="") pred print b.


0 pre odpoveď č. 4

Vzhľadom na to:

$ echo "$s"
aws:cloudformation:logical-id="somestring" Name="abc" Product="xyz" Role="www" aws:autoscaling:groupName="strings-and-numbers-012345" aws:cloudformation:stack-id="strings-and-numbers-012345" aws:cloudformation:stack-name="strings-and-numbers-012345"

S GNU Grep a Perl regex môžete:

$ echo "$s" | grep -Po "(bName=.*?)(?=aws)"
Name="abc" Product="xyz" Role="www"

Ak sú polia, ktoré vás zaujímajú, prísne pozičné, môžete použiť awk alebo cut pre tlač týchto pozičných polí:

$ echo "$s" | awk "{print $2, $3, $4}"
Name="abc" Product="xyz" Role="www"
$ echo "$s" | cut -d" " -f2-4
Name="abc" Product="xyz" Role="www"

Vyradiť všetky záznamy, ktoré začínajú aws môžeš použiť perl:

$ echo "$s" | perl -lane "foreach (@F) {$s=$s."$_ " unless /^aws/} print "$s""
Name="abc" Product="xyz" Role="www"

alebo

$ echo "$s" | perl -lane "print join(" ", grep {!/^aws/} @F)"
Name="abc" Product="xyz" Role="www"