複数行複数の文字列を1行に

複数行複数の文字列を1行に

入力(複数行):

abc def ghi 123 345 456 
abc def def ghi 123 345 456
abc def def def ghi 123 345 456 

出力(1行から1行に文字列/正規表現を抽出):

def 345
def def 345
def def def 345

最初...

echo "abc 123" | grep -Po "\Kabc|\K123"

ただし、これにより2行が印刷されます。

abc
123

第二:

echo -ne "abc def bac 123\nabc def def bac 123\nabc def def def bac 123 123\n" | grep -Po "def|123" | paste -d ' ' - -

しかし、これは次のことを示しています。

def 123
def def
123 def
def def
123 123

私の考えでは:

def 123
def def 123
def def def 123 123

\ nを削除するためにtrを使用することはできません。 def または 345 は 1 行に複数回見つかる可能性があり、他のすべての行を削除する \n は意味がありません。列区切り記号は使用できません。

ベストアンサー1

そしてperl

$ cat ip.txt
abc def ghi 123 345 456 
abc def def ghi 123 345 456
abc def def def ghi 123 345 456 1234

$ perl -lane 'print join " ", grep { /def|123/ } @F' ip.txt
def 123
def def 123
def def def 123 1234

$ perl -lane 'print join " ", grep { $_ eq "def" || $_ eq "123" } @F' ip.txt
def 123
def def 123
def def def 123
  • -laneここでは-l、入力行から改行を削除しprint、使用時-aに再追加し、入力行を空白に自動的に分割し、結果を@F配列に保存し、-n入力行を繰り返しますが、処理後に行を自動的に印刷せずにコマンドで-e許可します。 Perlスクリプトラインを提供
  • grep { /def|123/ } @Fまたはを@F含む場合は、配列内のすべての要素をフィルタリングします。def123
    • 正規表現の代わりに文字列マッチングが必要な場合は、次のようになります。grep { $_ eq "def" || $_ eq "123" } @F
  • print join " "grepスペースを区切り文字として使用して、出力から得られた要素を印刷します。

おすすめ記事