1行だけ印刷するファイルがあります。この行を操作するために他のsedコマンドを使用するのが困難です。
apple orange.5678 dog cat 009 you
私は"orange.5678"をつかみ、"you"を含み、他のすべてを無視したいと思います。以下のように見えるといいです。
orange.5678 you
どこから始めるべきか、「orange.5678」と「you」を除くすべての項目を除外する方法がわかりません。どんな助けでもいいでしょう!
答え1
$ sed -r 's/.* ([^ ]+\.[^ ]+).* ([^ ]+)$/\1 \2/' orange
orange.5678 you
説明する
-r
拡張正規表現の使用s/old/new
old
使用。 。 。交換new
.*
任意の文字数(some characters)
some characters
後で交換するときに参考になるように保存してください。[^ ]+
空白以外の一部の文字\.
テキストポイント$
行末\1
保存されたスキーマの逆参照
つまりs/.* ([^ ]+\.[^ ]+).* ([^ ]+)$/\1 \2/
、空白以外の文字の前の空白まで行のすべての項目を一致させ、.
その後に空白以外の文字を一致させて(対応する文字を両側に保存.
)、任意の文字を一致させ、最後の行セットを保存しないことを意味します。 - スペース文字をオンにし、一致全体をスペースで区切られた2つの保存されたパターンに置き換えます。
答え2
最も簡単な方法:
awk '{print $2, $6}' file.txt
実際のユースケースが質問が示すよりも複雑で追加のロジックが必要な場合(例:そうでない場合)いつも必要な2番目と6番目のフィールド)質問を編集してください言う。
答え3
人々は@Zannaの他の答えを見なければなりません。非常にエレガントで正規表現の力を示しています。
この表現を試してみてくださいgawk
。通常のawkはグループ化では機能しません。
^(?:\w+\s){0,}(\w+\.\w+)(?:\s\w+){0,}\s(\w+)$
次の変更で機能します。
apple orange.5678 dog cat 009 you
apple apple grape.9991 pig cat piegon owl
grape.9991 pig cat piegon owl
以下は、表現の説明です。
/
^(?:\w+\s){0,}(\w+\.\w+)(?:\s\w+){0,}\s(\w+)$
/
g
^ asserts position at start of the string
Non-capturing group (?:\w+\s){0,}
{0,} Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
\s matches any whitespace character (equal to [\r\n\t\f\v ])
1st Capturing Group (\w+\.\w+)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
\. matches the character . literally (case sensitive)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
Non-capturing group (?:\s\w+){0,}
{0,} Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
\s matches any whitespace character (equal to [\r\n\t\f\v ])
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
\s matches any whitespace character (equal to [\r\n\t\f\v ])
2nd Capturing Group (\w+)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
$ asserts position at the end of the string, or before the line terminator right at the end of the string (if any)
答え4
sedに正規表現を使用する必要がある場合は、上記の答えで解決できます。選択肢が開いている場合:
gv@debian: $ read -r a b c d e f<<<"apple orange.5678 dog cat 009 you" && echo "$b $f"
orange.5678 you
これがファイルの1行の場合は、<<<"...."
次のように置き換えます。<file
この方法が機能するには、デフォルトのIFS = spaceが必要です。重複する場合は、IFS=" "
最初から適用してください。