回答:
ここではawkの方が良いツールかもしれません。
$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost
「POP3_SERVER_NAME」を含む行を検索します。最後のフィールドを印刷します。これは、POP3_SERVER_NAMEが常に行3にあることに依存していません。これはおそらく良いことです。
$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost
アプリケーションによっては、正規表現をより厳密にする必要がある場合があります。たとえば、POP3_SERVER_NAME で始まる行のみを一致させたい場合があります。
$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost
sedの使用は少し直感的ではありません。(ありがとう、私は皮肉に気づいています。)POP3_SERVER_NAMEを含む行をどこにでもアドレスします。行の先頭から「=」に続くオプションのスペースまでのすべてのテキストを空の文字列に置き換えます。次に印刷します。
sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
awkをスペースから別の何かに変更できます-F。たとえば、あなたが言及した場合に区切り文字として-F "="使用=します。
p行の不要な部分を削除する置換でコマンドを置き換えます。
sed -n '3 s/^[^=]*= *//p' installation.sh
位置ではなくキーワードで行を一致させることができます。
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
設定ファイルがあるようです。できることは、Adam Siemeon / slmが提案するものに似ています:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
ここで[^=]除外全て「=」文字は、+一つ以上の文字の同じタイプの、これは実際に続いて言う=、\sタブを含む任意の空白(\tおよび新しい行\n、\r\nおよび普通スペース「」は、一方*の手段は、ゼロ個以上の同じタイプの、括弧は2、...、\ nは交換用のプレースホルダ、\ \ 1にマッチした文字列を配置するために内側に何をキャッチ$行の終わりを意味これは典型的な置換パターンを、次のとおりです。s/.../.../modifiers。コマンドラインオプションは、-rの略拡張されたregex構文(便宜上)および-n明示的に要求されるまで、または明示的に要求されない限り、何も出力しないことを意味しますp。
次のgような修飾子を使用してグローバル検索を実行できます。
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
あなたがで区切られた文字列を取得すること' '(可能性があり\n、\tまたは何を持っている)あなたは簡単に処理することができます。
両方の式が有効なのは、等式文字が行の最後まで続く値であり、単純な「値」から逸脱したセマンティクスを持つコメントまたは他の文字が後に続かない場合です。
他の人の投稿にはまだコメントできません。行を示すには、行番号を渡します。ケース3ではs、開始引用文字の前または前に(vimのように)渡します。
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
をご覧くださいinfo sed。たとえば、3.2と4.7は特に重要です。
Linux / Unixの利点は、通常、何かを達成する方法が複数あることです。opの場合、ファイルからPOPサーバー名を抽出するには、少なくとも4つの異なる方法があります。
grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2grep POP3_SERVER_NAME installation.sh | awk '{print $3}'grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
awkコマンドはいいです-しかし、あなたは周りのスペースを持っている場合にのみ=。それは動作しませんPOP3_SERVER_NAME=localhost。