sedから特定の文字の前の文字を除外する

sedから特定の文字の前の文字を除外する

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/newold使用。 。 。交換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=" "最初から適用してください。

関連情報