sedを使用してファイルから行の一部を抽出する

sedを使用してファイルから行の一部を抽出する

ファイルから1行の一部を読みたいです。たとえば、

POP3_SERVER_NAME =ローカルホスト

私はlocalhostsedを使って戻りたいです。

このテキストは3行目にあります。私は行を抽出するためにこれを行います:

sed -n '3p' installation.sh

部分のみを抽出する方法はlocalhost

答え1

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の使用はそれほど直感的ではありません。 (ありがとうございました。行の先頭から「=」の後のオプションのスペースまでのすべてのテキストを空の文字列に置き換えます。その後、印刷します。

sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat

答え2

p行から不要な部分を削除する代替コマンドでコマンドを置き換えます。

sed -n '3 s/^[^=]*= *//p' installation.sh

場所ではなくキーワードに基づいて行を一致させることができます。

sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh

答え3

すでに設定ファイルがあるようです。あなたができることは、Adam Siemeon / slmが提案したものと似ています。

sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename

これは[^=]すべての '='文字を除外します。+これは、同じタイプの1つ以上の文字の後に実際のスペース(タブと改行を含む、純粋なスペースを含む)が=続き、同じタイプが0個以上あることを意味する角括弧です。行の終わりを表す\ 1、\ 2、...、\ n代替プレースホルダに一致する文字シーケンスを配置して、内部コンテンツをキャプチャします。これは、次の一般的な代替パターンに従います。コマンドラインオプションは拡張一般として表示されます。式構文(便宜上)。明示的に要求するまでは何も出力されません。\s\t\n\r\n*$s/.../.../modifiers-r-np

修飾子を使用してグローバルに検索できますg。たとえば、次のようになります。

sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename  # note the space after \1

' 'これにより、(can be\nまたは what have you)\t区切り文字列を取得し、簡単に処理できます。

値の前に等号文字があり、行の末尾まで拡張され、意味が単純な「値」から外れるコメントやその他の文字が後に続かない場合は、どちらも有効です。


編集する:

ここではまだ他の人の投稿にコメントすることはできません。行を表示するには、開いているs引用符の前または前に行番号(あなたの場合は3)を渡します(vimと同じように)。

sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename

これを見てくださいinfo sed。たとえば、特に3.2と4.7に興味があります。

答え4

echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost

またはファイルにコンテンツがある場合:

sed 's/.*= //' somefile.txt
localhost

関連情報