How to use sed/grep to extract text between two words?

后端 未结 12 2331
春和景丽
春和景丽 2020-11-22 05:25

I am trying to output a string that contains everything between two words of a string:

input:

\"Here is a String\"

output:

12条回答
  •  北恋
    北恋 (楼主)
    2020-11-22 05:57

    Problem. My stored Claws Mail messages are wrapped as follows, and I am trying to extract the Subject lines:

    Subject: [SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key molecular
     link in major cell growth pathway: Findings point to new potential
     therapeutic target in pancreatic cancer [mTORC1 Activator SLC38A9 Is
     Required to Efflux Essential Amino Acids from Lysosomes and Use Protein as
     a Nutrient] [Re: Nutrient sensor in key growth-regulating metabolic pathway
     identified [Lysosomal amino acid transporter SLC38A9 signals arginine
     sufficiency to mTORC1]]
    Message-ID: <20171019190902.18741771@VictoriasJourney.com>
    

    Per A2 in this thread, How to use sed/grep to extract text between two words? the first expression, below, "works" as long as the matched text does not contain a newline:

    grep -o -P '(?<=Subject: ).*(?=molecular)' corpus/01
    
    [SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key
    

    However, despite trying numerous variants (.+?; /s; ...), I could not get these to work:

    grep -o -P '(?<=Subject: ).*(?=link)' corpus/01
    grep -o -P '(?<=Subject: ).*(?=therapeutic)' corpus/01
    etc.
    

    Solution 1.

    Per Extract text between two strings on different lines

    sed -n '/Subject: /{:a;N;/Message-ID:/!ba; s/\n/ /g; s/\s\s*/ /g; s/.*Subject: \|Message-ID:.*//g;p}' corpus/01
    

    which gives

    [SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key molecular link in major cell growth pathway: Findings point to new potential therapeutic target in pancreatic cancer [mTORC1 Activator SLC38A9 Is Required to Efflux Essential Amino Acids from Lysosomes and Use Protein as a Nutrient] [Re: Nutrient sensor in key growth-regulating metabolic pathway identified [Lysosomal amino acid transporter SLC38A9 signals arginine sufficiency to mTORC1]]                              
    

    Solution 2.*

    Per How can I replace a newline (\n) using sed?

    sed ':a;N;$!ba;s/\n/ /g' corpus/01
    

    will replace newlines with a space.

    Chaining that with A2 in How to use sed/grep to extract text between two words?, we get:

    sed ':a;N;$!ba;s/\n/ /g' corpus/01 | grep -o -P '(?<=Subject: ).*(?=Message-ID:)'
    

    which gives

    [SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key molecular  link in major cell growth pathway: Findings point to new potential  therapeutic target in pancreatic cancer [mTORC1 Activator SLC38A9 Is  Required to Efflux Essential Amino Acids from Lysosomes and Use Protein as  a Nutrient] [Re: Nutrient sensor in key growth-regulating metabolic pathway  identified [Lysosomal amino acid transporter SLC38A9 signals arginine  sufficiency to mTORC1]] 
    

    This variant removes double spaces:

    sed ':a;N;$!ba;s/\n/ /g; s/\s\s*/ /g' corpus/01 | grep -o -P '(?<=Subject: ).*(?=Message-ID:)'
    

    giving

    [SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key molecular link in major cell growth pathway: Findings point to new potential therapeutic target in pancreatic cancer [mTORC1 Activator SLC38A9 Is Required to Efflux Essential Amino Acids from Lysosomes and Use Protein as a Nutrient] [Re: Nutrient sensor in key growth-regulating metabolic pathway identified [Lysosomal amino acid transporter SLC38A9 signals arginine sufficiency to mTORC1]]
    

提交回复
热议问题