文字列の2つの単語間のすべてを含む文字列を出力しようとしています。
入力:
"Here is a String"
出力:
"is a"
使用:
sed -n '/Here/,/String/p'
エンドポイントが含まれていますが、含めたくありません。
sed
FAQは、「特定の行の間のテキストを抽出する方法」です。これはstackoverflow.com/questions/16643288/...
文字列の2つの単語間のすべてを含む文字列を出力しようとしています。
入力:
"Here is a String"
出力:
"is a"
使用:
sed -n '/Here/,/String/p'
エンドポイントが含まれていますが、含めたくありません。
sed
FAQは、「特定の行の間のテキストを抽出する方法」です。これはstackoverflow.com/questions/16643288/...
回答:
sed -e 's/Here\(.*\)String/\1/'
echo "Here is a one is a String" | sed -e 's/one is\(.*\)String/\1/'
。「one is」と「String」の間の部分だけが必要な場合は、正規表現を行全体に一致させる必要がありますsed -e 's/.*one is\(.*\)String.*/\1/'
。sedでは、s/pattern/replacement/
「各行の「パターン」を「置換」に置き換えて」と言います。「パターン」に一致するもののみが変更されるため、行全体を置き換える場合は、「パターン」を行全体に一致させる必要があります。
Here is a String Here is a String
GNU grepは、ポジティブとネガティブの先読みとルックバックもサポートできます。あなたの場合、コマンドは次のようになります。
echo "Here is a string" | grep -o -P '(?<=Here).*(?=string)'
Here
and が複数ある場合はstring
、最初Here
と最後から一致させるstring
か、個別に一致させるかを選択できます。正規表現では、貪欲な一致(最初のケース)または貪欲でない一致(2番目のケース)と呼ばれます。
$ echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*(?=string)' # Greedy match
is a string, and Here is another
$ echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*?(?=string)' # Non-greedy match (Notice the '?' after '*' in .*)
is a
is another
-P
オプションはgrep
* BSDに含まれているオプション、またはSVR4(Solarisなど)に付属しているオプションには存在しないことに注意してください。FreeBSDでは、PCRE(および先読み/後読み)をサポートするdevel/pcre
を含むポートをインストールできますpcregrep
。古いバージョンのOSXはGNU grepを使用していましたが、OSX Mavericksでは-P
、オプションを含まないFreeBSDのバージョンから派生しています。
Here is a string a string
、両方 " is a "
と" is a string a "
質問の要件ごとに有効な解答(引用符を無視する)、です。それはあなたがこれらのうちどれをあなたが望むかによります、そしてそれから答えはそれに応じて異なる場合があります。とにかく、あなたの要件のために、これは動作します:echo "Here is a string a string" | grep -o -P '(?<=Here).*?(?=string)'
受け入れ答えは前に可能性があり、テキストは削除されませんHere
か後にString
。この意志:
sed -e 's/.*Here\(.*\)String.*/\1/'
主な違いは、.*
直前Here
と直後の追加ですString
。
.
改行と一致しません。改行を一致させたい場合は、.
などに置き換えることができます[\s\s]
。
Bashだけで文字列を取り除くことができます。
$ foo="Here is a String"
$ foo=${foo##*Here }
$ echo "$foo"
is a String
$ foo=${foo%% String*}
$ echo "$foo"
is a
$
PCREを含むGNU grepがある場合は、ゼロ幅アサーションを使用できます。
$ echo "Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a
GNU awkを通じて、
$ echo "Here is a string" | awk -v FS="(Here|string)" '{print $2}'
is a
-P
(perl-regexp)パラメーターを指定したgrepは\K
、以前に一致した文字を破棄するのに役立ちます。今回のケースでは、以前に一致した文字列がHere
最終出力から破棄されたためです。
$ echo "Here is a string" | grep -oP 'Here\K.*(?=string)'
is a
$ echo "Here is a string" | grep -oP 'Here\K(?:(?!string).)*'
is a
出力にしたい場合はis a
、以下を試すことができます、
$ echo "Here is a string" | grep -oP 'Here\s*\K.*(?=\s+string)'
is a
$ echo "Here is a string" | grep -oP 'Here\s*\K(?:(?!\s+string).)*'
is a
echo "Here is a string dfdsf Here is a string" | awk -v FS="(Here|string)" '{print $2}'
、@ Avinash Rajのis a
代わりに返されるだけですis a is a
複数行のオカレンスが多数ある長いファイルがある場合は、最初に番号行を印刷すると便利です。
cat -n file | sed -n '/Here/,/String/p'
-n
オプションをcat
省略しなければなりません。
cat
、完全に省略できます。sed
ファイルまたは標準入力を読み取る方法を知っている。
sed
コマンドを理解するには、ステップバイステップでコマンドを構築する必要があります。
これが元のテキストです
user@linux:~$ echo "Here is a String"
Here is a String
user@linux:~$
ubstitionオプションでHere
文字列を削除してみましょうs
sed
user@linux:~$ echo "Here is a String" | sed 's/Here //'
is a String
user@linux:~$
この時点で、あなたString
も削除できると思います
user@linux:~$ echo "Here is a String" | sed 's/String//'
Here is a
user@linux:~$
しかし、これは望ましい出力ではありません。
2つのsedコマンドを組み合わせるには、-e
オプションを使用します
user@linux:~$ echo "Here is a String" | sed -e 's/Here //' -e 's/String//'
is a
user@linux:~$
お役に立てれば
使用できます\1
(http://www.grymoire.com/Unix/Sed.html#uh-4を参照):
echo "Hello is a String" | sed 's/Hello\(.*\)String/\1/g'
括弧内の内容はとして保存され\1
ます。
問題。 保存されているClaws Mailメッセージは次のようにラップされており、件名行を抽出しようとしています。
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>
このスレッドのA2ごとに、sed / grepを使用して2つの単語間のテキストを抽出する方法は?以下の最初の式は、一致したテキストに改行が含まれていない限り「機能」します。
grep -o -P '(?<=Subject: ).*(?=molecular)' corpus/01
[SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key
ただし、多数のバリアント(.+?; /s; ...
)を試しても、これらを機能させることができませんでした。
grep -o -P '(?<=Subject: ).*(?=link)' corpus/01
grep -o -P '(?<=Subject: ).*(?=therapeutic)' corpus/01
etc.
解決策1。
sed -n '/Subject: /{:a;N;/Message-ID:/!ba; s/\n/ /g; s/\s\s*/ /g; s/.*Subject: \|Message-ID:.*//g;p}' corpus/01
与える
[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]]
ソリューション2. *
あたりはどのようにsedを使って(\ n)は改行を置き換えることができますか?
sed ':a;N;$!ba;s/\n/ /g' corpus/01
改行をスペースに置き換えます。
2つの単語間のテキストを抽出するためにsed / grepを使用する方法の A2でそれを連鎖させますか?、 我々が得る:
sed ':a;N;$!ba;s/\n/ /g' corpus/01 | grep -o -P '(?<=Subject: ).*(?=Message-ID:)'
与える
[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]]
この亜種は二重スペースを削除します:
sed ':a;N;$!ba;s/\n/ /g; s/\s\s*/ /g' corpus/01 | grep -o -P '(?<=Subject: ).*(?=Message-ID:)'
与える
[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]]
Here is a Here String
か?またはI Hereby Dub Thee Sir Stringy
?