Linuxの基礎(9)

正規表現の基礎

正規表現

また、正規表現、正規表現、正規表現、正規表現、従来の表記法として知られている正規表現、(英語:正規表現、コードは多くの場合、正規表現、正規表現またはREと略す)、コンピュータサイエンスの概念。正規表現は、単一の文字列、マッチング構文規則一連の文字列ラインの使用を記載します。多くのテキストエディタでは、正規表現は、多くの場合、取得モデルのものと行のテキストを置き換えるために使用されます。

単に私たちの前で話すような正規表現とワイルドカードの形や機能に置くが、それらの間の大きな違いは、特に、そこにある、いくつかの特別なマッチング文字の意味という。

栗:

これら二つの文字列、同じ表現我々は「shiyanlou」が含まれ、このようなテキストファイルがあるとし、「shilouyan」:

shi*

正規表現としてではない場合、これは正規表現として、それだけで、市が一致する場合は*、ワイルドカードとして、それは同時に2つの文字列にマッチします。これはなぜでしょうか?正規表現があるため*、それは「SH」、「しい」、一致させることができるように、その整合部分式(これはその前の文字である)は、ゼロ回以上、例えば示す 「シシ」、「shiishi」 等それは「shiyanlou」と一致し、2つの文字「shilouyan」できるように、任意のより多くのバックワイルドカード文字に一致するワイルドカードを表します。

  • 基本的な構文
    正規表現は、一般的パターン(パターン)と呼ばれ、直列または文字列マッチングの構文規則に一致を記述するために使用されます。
    1)を選択して
    |選択を示す縦の区切り文字を、例えば、「男の子|女の子」一致「少年」や「ガール」
    2)数が定義されて
    私たちの例に添加することによって定義された数を*、そこにある+プラス記号、?疑問符、そうでない場合のモードでは、プラス数量詞は、一度発生を示し、一回のみ:
    +その文字は、少なくとも(1回以上)後に表示される必要がありますを示し、例えば、「グー+ GLE」、「goooogleと」、「gooogle」を一致させるなどすることができます。
    ?ことを示しています高々 (0または1)一度文字が表示されますが、例えば、「?colou rは」、「色」や「色」を一致させることができます。
    *アスタリスクの前の文字を表し表示されないことがあり、また、1回以上発生する可能性があります(0回、または1以上)、例えば、 "0 * 42"のよう42,042,0042,00042に一致します。
    3)優先範囲
    ()括弧は、パターン文字列と優先順位の範囲を定義するために使用することができる、これは単に全体として括弧文字列内のパターンかどうかのように理解することができます。例えば、「GR(| E) Y」は、「(グランド)父親(E GRAとEY代わり垂直セパレータを選択するかのために、実施優先)、|「灰色」に相当しますか ? 「マッチングの父と祖父(ここでは範囲を反映している?マッチ全体として括弧の内容)。

4)構文(一部)
多くの異なるスタイルで正規表現を、下記のように一般的に使用されるいくつかPCREのサブセットに適用されるperlpython、プログラミング言語及びgrep又はegrep正規表現マッチングルール:

PCRE(Perlの意味互換正規表現中国:Perl互換の正規表現言語は)フィリップ・ハイス(フィリップ・ヘイゼル)によって書かれた正規表現のC言語ライブラリ、..です PCREライブラリは、Boostライブラリのような正の表現ははるかに小さいよりも、軽量です。PCREは非常に使いやすいですし、強力な機能、パフォーマンスは、POSIX正規表現ライブラリといくつかの古典的な正規表現ライブラリを上回りました。

\次の文字は特殊文字、またはリテラル文字としてマークされています。例えば、「N」の文字「N」にマッチします。「\ N」は改行にマッチします。シーケンス「\」マッチ「\」とは、「(」マッチ「(」
^:文字列の先頭を一致。
$:文字列の入力端と一致します。
{n}:Nは非負の整数n回一致する決意です。例えば、「O {2}」「O」の「ボブ」に一致しないが、二つのOに「食品」と一致することができる
{n,}:N 。少なくとも一致で非負整数n回であり
、例えば、「O {2 } O "の"ボブ"に一致しません" "が、一致させることができる" fooooodを。 "Oすべてに" O {1} + O "と等価である" "" {oを 0}」 と等価です「* O.」:
{n,m}M 。少なくともおよびn負でない整数であり、n <= M一致n回の時間をMと一致は、例えば、「O {1,3}」最初の三つの「fooooood」と一致します。 。A O「O {0,1}」に相当し、コンマと番号2の間にスペースことに注意してください「O」。
*。0回以上前の部分正規表現に一致しない。例えば、ZO * 。「Z」、「ZO」と「動物園」を一致させることができると等価である{0} :
+前の部分式の一つまたはそれ以上の回数に一致する。例えば、「ZO +」マッチ「ZO」と「動物園」が、 「Z」に一致しない。+は{1}と等価です
?。マッチ部分式0または1を先行例えば、「行う」と一致する「?(ES)を行う」または「実行」の「ん」{0,1}と等価です。?。
?:とき直ちに他の修飾子に文字(
、+ ,, N- {}、N- {、}、{N-、M}?)場合リア、非貪欲マッチングパターン。できるだけ少しなどの非貪欲パターン一致検索文字列、および文字列検索の限り、デフォルト貪欲なパターンが一致しました。たとえば、文字列「OOOO」、「+ oは? 」 シングル「O」に一致し、「O +」すべての「o」に一致しますでしょう。
.「\ n」はある除く任意の1文字に一致しますモード| "(。\ N)"などの使用を含む"\ n"は、を含め、すべての文字にマッチします。
(pattern)マッチパターンとは、この試合の部分文字列を取得します後方参照のストリングです。括弧文字を一致させるには、「(」または「)」を使用します
x|yマッチは、Xまたは Y。例えば、「Z |食品」「Z」や「食べ物」を一致させることができます。"zood"または"食品"に一致する| "(Z F)OOD"。
[xyz]:文字のセット(文字クラス)。付属の任意の文字と一致しますたとえば、「[abc]は、」「普通」が「」に一致します。これはエスケープ文字のための特別な意味を維持するだけの特殊文字のバックスラッシュ\です。などアスタリスク、プラス記号などの特殊文字通常の文字として括弧のすべての種類。キャレットは、^現在では、文字の負の最初のセットを言った場合、それだけで通常の文字として文字列の途中で発生した場合ハイフン-説明範囲を表す文字列の途中であれば、それだけで通常の文字として最初の場所に表示されている場合
[^xyz]:タイプ(否定)文字のセットを除外します。記載されていない任意の文字がマッチしますたとえば、 "[^ abc]は" "PLIN"で"普通"と一致します。
[a-z]:文字の範囲。指定された範囲内の任意の文字に一致します例えば、「[AZ]」マッチ「」小文字アルファベットのいずれかに「Z」の範囲。
[^a-z]:文字の範囲は、タイプを除外しました。ない任意の指定した範囲内の任意の文字と一致しますたとえば、「[^ AZ]」「」任意の文字に「Z」の範囲をいずれにも一致しないかもしれません。

5)優先順位の
高い順に上から下へ、左から右への優先権、:
\エスケープ
(), (?:), (?=), []:ブラケットとブラケット
*、+、?、{n}、{n,}、{n,m}:修飾子
^、$、\任何元字符:位置決め部位および配列
:選択

grepのパターンマッチングコマンド

1)基本操作
grep正規表現パターンマッチングなどの使用条件に、出力文字列に一致するパターンを印刷するコマンド。grep:三つのパラメータで指定されたサポート3つの正規表現エンジン、
-E:POSIX拡張正規表現を、ERE
-G:POSIX基本正規表現、BRE
-P:Perlの正規表現、PCRE

grep第一の共通パラメータを導入コマンド正規表現を使用する前に:
-bテキストマッチなどのバイナリファイル
-cの数に一致するモードの統計
-iを無視した場合の
-n行のテキストに一致表示ライン番号
-v選択を解除し、出力は、行の内容と一致しません
-r再帰一致検索は
-A n、一致するラインに加えて、意味の後表す正の整数が表示されているだけでなく、N行の後記載されているN
-B nとn記載されている整合ラインに加えて、前の意味を表す正の整数であるが、先に記載されていますn行は、
--color=auto出力色の設定が自動的に表示される一致する
ここに画像を挿入説明
正規表現を使用して)2
BRE、基本的な正規表現を使用して

  • 場所の
    検索行の先頭に「shiyanlou」に/ etc / groupファイル:
$ grep 'shiyanlou' /etc/group
$ grep '^shiyanlou' /etc/group

ここに画像を挿入説明

  • 数量
# 将匹配以'z'开头以'o'结尾的所有字符串
$ echo 'zero\nzo\nzoo' | grep 'z.*o'
# 将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串
$ echo 'zero\nzo\nzoo' | grep 'z.o'
# 将匹配以'z'开头,以任意多个'o'结尾的字符串
$ echo 'zero\nzo\nzoo' | grep 'zo*'

ここに画像を挿入説明

  • 選択
# grep默认是区分大小写的,这里将匹配所有的小写字母
$ echo '1234\nabcd' | grep '[a-z]'
# 将匹配所有的数字
$ echo '1234\nabcd' | grep '[0-9]'
# 将匹配所有的数字
$ echo '1234\nabcd' | grep '[[:digit:]]'
# 将匹配所有的小写字母
$ echo '1234\nabcd' | grep '[[:lower:]]'
# 将匹配所有的大写字母
$ echo '1234\nabcd' | grep '[[:upper:]]'
# 将匹配所有的字母和数字,包括0-9,a-z,A-Z
$ echo '1234\nabcd' | grep '[[:alnum:]]'
# 将匹配所有的字母
$ echo '1234\nabcd' | grep '[[:alpha:]]'

ここに画像を挿入説明
[:alnum:]代表的な英語は0-9、AZ、AZ、すなわち文字と数字、小文字
[:alpha:]の任意の英語小文字、すなわちAZ、AZ表し
[:blank:]両方白鍵[タブ]ボタンの代表的な
[:cntrl:]キーボード上の制御ボタンの代表、すなわちを含むCRを、LF、タブ、デル...等
[:digit:]代表的なデジタルだけ、すなわち、0-9
[:graph:]ブランクバイト([Tab]キーとキーブランク)外の他のすべてのキーに加えて、
[:lower:]小文字の代わりに、すなわち、AZは、
[:print:]いずれもプリントアウトすることができ表します文字
[:punct:]、すなわち句読点(句読点記号)の代表、: "「;:#$ ...?!
[:upper:]大文字の代わりに、AZはある
[:space:]など、空白キー、[タブ]を含む空白文字、CRを生成することは何も
[:xdigit:]進数の代わりに、数値備え種類、:0-9、AF、およびAF数字バイト

# 排除字符
$ $ echo 'geek\ngood' | grep '[^o]'

注:^内部は、括弧内に置かれ、文字、またはラインのことを除外します。
ここに画像を挿入説明
使用して正規表現を拡張し、ERE
を通じてgrep拡張正規表現の使用は、追加する必要がある-Eパラメータまたは使用をegrep

  • 数量
# 只匹配"zo"
$ echo 'zero\nzo\nzoo' | grep -E 'zo{1}'
# 匹配以"zo"开头的所有单词
$ echo 'zero\nzo\nzoo' | grep -E 'zo{1,}'

注:推奨把握{N、M}することができ、+、 - 、*、これらのあまり直感的、かつ混乱しやすいです?。

  • 選択
# 匹配"www.shiyanlou.com"和"www.google.com"
$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -E 'www\.(shiyanlou|google)\.com'
# 或者匹配不包含"baidu"的内容
$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -Ev 'www\.baidu\.com'

注:数値は、特別な意味を持っているので、エスケープする必要があるため。

sedはストリームエディタ

。1)共通パラメータは、sedの説明
sedコマンドの基本的なフォーマットを:

sed [参数]... [执行命令] [输入文件]...
# 形如:
$ sed -i 's/sad/happy/' test # 表示将test文件中的"sad"替换为"happy"

パラメータ:
-n静かなモードで、唯一の影響を受けた行を印刷し、デフォルトでは、入力データの内容全体印刷し
-e、一度実行以上の実行コマンドを追加するためにスクリプトで使用するコマンドラインに複数のコマンドを実行し、通常は、このパラメータを追加する必要はされ
-f filenameたファイルは、ファイル名を実行して指定しますコマンドは、
-rデフォルトでは、標準の正規表現で、拡張正規表現を使用する
-i代わりに、直接標準出力に印刷する、入力ファイルの内容を変更し
、「実行」を名詞として解釈されsedの編集者は()を実行します)2
コマンド形式を実行するのsed :

[n1][,n2]command
[n1][~step]command
# 其中一些命令可以在后面加上作用范围,形如:
$ sed -i 's/sad/happy/g' test # g表示全局范围
$ sed -i 's/sad/happy/4' test # 4表示指定行中的第四个匹配字符串

n1は、n2は中でも、入力内容の行数を示すことを特徴とする請求,場合コンマは、N1からN2線に示す波数がすべての行の先頭にステップN1から発現される段階的、アクションを実行するためのコマンドを、次のいくつかのために一般的な操作コマンド:
sあるいはインライン
cあるいは行全体
a指定した行の後に挿入
i指定した行の前に挿入
p印刷指定ラインは、典型的には、-n引数と組み合わせて使用する
d指定された行を削除する
3)sedの動作例を

$ cp /etc/passwd ~
# 打印制定行
# 打印2-5行
$ nl passwd | sed -n '2,5p'
# 打印奇数行
$ nl passwd | sed -n '1~2p'

# 行内替换
# 将输入文本中"shiyanlou" 全局替换为"hehe",并只打印替换的那一行,注意这里不能省略最后的"p"命令
$ sed -n 's/shiyanlou/hehe/gp' passwd

# 删除某行
$ nl passwd | grep "shiyanlou"
# 删除第30行
$ sed -i '30d' passwd

awkのテキスト処理言語

1)導入AWK
、我々はUbuntuの上で私たちの環境で実際のgawk(GNUのAWK、GNUのawkのバージョン)を使用する上で、デフォルトのmawkによって提供され、ほとんどのLinuxディストリビューションでは、我々は通常、直接コマンドのawkを使用することができます(awk言語インタプリタ)、システムが私たちのためのmawkのawkのを指すシンボリックリンクを作成されているので。

$ ll /usr/bin/awk

2)AWKの基本的な概念のいくつかの
すべての操作AWKは以下の形式のように、熟練のパターン(模様)-action(操作)に基づいています。

$ pattern {action}

多くのプログラミング言語に見られるように、すべての動きは、中括弧で囲まれた一対の{}動作します。パターンは、典型的には、入力テキスト「関係」又は「正規表現」、アクションを一致させるために使用されることがマッチングの後に行われる動作です。何のアクションが画面にデフォルトの印刷適合コンテンツではない場合にのみ、のいずれかどちらも完全AWK動作において、全体のテキストパターンマッチングは、デフォルトの入力された場合ではありません。

awkの双方向テキスト処理は、その後、これらのフィールドが処理され、「フィールド」、デフォルト、フィールドを区切るawkのスペースの数にテキストを分割することですが、これは固定されていない、あなたは、任意の区切り文字を指定することができます。

3)awkコマンドの基本的な形式

awk [-F fs] [-v var=value] [-f prog-file | 'program text'] [file...]

前記-Fパラメータが予め指定されたフィールドセパレータ(フィールドを指定する他の方法が存在する)ために使用され、前述の-v前に使用されるがawk、可変プログラム指定された-fパラメータを指定awkせずに、または中に、実行されるファイルコマンド-fパラメータケースここで直接上のプログラムのステートメントに、そして最終的にawk対処すべきテキスト入力の必要性、および同時に複数のテキストファイルを入力することができます。

4)awkの運転経験
vimの新しいテキストドキュメントで最初:

$ vim test

これは、次のものが含まれます。

I like linux
www.shiyanlou.com
  • 使用すると、端末にテキストを印刷するawkは:
# "quote>" 不用输入
$ awk '{
> print
> }' test
# 或者写到一行
$ awk '{print}' test

注:この動作は、そうデフォルトでAWKの全内容は、入力されたテキストに一致するパターンでは省略され、「{}」括弧は本文ここで、すべての印刷マッチを印刷するために、すなわち、アクションを実行するに

  • 単一の線として表示される最初の行の各フィールドのテスト
$ awk '{
> if(NR==1){
> print $1 "\n" $2 "\n" $3
> } else {
> print}
> }' test

# 或者
$ awk '{
> if(NR==1){
> OFS="\n"
> print $1, $2, $3
> } else {
> print}
> }' test

説明:まず、それは使用場所、ことに留意すべきであるawkブランチ選択文の言語if、そこにも理解されるであろう、あなたがこれらの言語の基礎を持っている場合は、その使用、および、そのようなC / C ++言語などの高級言語の多くは、基本的に同じです。もし別のことに注意NRし、OFSこれらの二つがされてawk構築された変数はNR、レコードの現在の数が読み表し、あなたは、単に現在処理ラインの数として理解することができますが、OFS「フィールドセパレータ、デフォルトは」あるときに出力を表し、フィールドセパレータセットにスペース、および\n改行を、フィールドの最初の行は、別々の行に出力する元々コンテンツスペースで区切られました。そして、$NどこNに対応するフィールド番号がある。これはawk、組み込み変数、それは対応するフィールドへの参照である、我々は唯一の三つのフィールドの1行目に現在地への参照のみそう$3ここで別の添加が表示されないです$0、それは全体の内容の現在のレコード(現在の行)への参照です。

  • フィールドの第二線分の点の試験は、空間に分離され
$ awk -F'.' '{
> if(NR==2){
> print $1 "\t" $2 "\t" $3
> }}' test

# 或者
$ awk '
> BEGIN{
> FS="."
> OFS="\t"  # 如果写为一行,两个动作语句之间应该以";"号分开  
> }{
> if(NR==2){
> print $1, $2, $3
> }}' test

説明:ここでは-F、パラメータ、それはレコード区切り文字の事前指定されたフィールドに扱われるべき、以前に導入されています。私たちは、指定に加えことに留意すべきであるOFS我々ができるprintように、ここで直接陳述などの特殊文字を印刷\t非印刷変数のコンテンツ利用に必要性を印刷する「」引用符のペアが囲みます予め指定された変数の区切り文字を達成する別の方法を示す上記の別のバージョン、すなわち使用しBEGIN、この式に示し、その後の動作は、これは、任意の動作の前に行われるFS新規の割り当て「」ポイントデフォルト「」スペースを置き換えます。

5)awkは組み込み変数の共通

FILENAME現在の入力ファイル名は、複数のファイルならば、最初を表しています。入力は、標準入力からのものである、または空の文字列の場合は
$0、現在のレコードの内容
$NNフィールドの数、変数NFの最大値を示し
FS、フィールドセパレータ、正の発現は、デフォルトで表される「」スペースで
RS入力レコードセパレータ、デフォルト記録動作さ「\ n」は、
NF現在のレコードのフィールド数
NRレコード数がに読み込まれている
FNR間NR差という、現在の入力ファイルのレコード数に注意してください
OFS出力フィールドセパレータ、デフォルトは「」スペースで
ORS、デフォルトでは、出力レコードセパレータ「N- \」として
ソース

公開された33元の記事 ウォンの賞賛1 ビュー1230

おすすめ

転載: blog.csdn.net/weixin_44783002/article/details/104940867