入力(複数行):
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
含む場合は、配列内のすべての要素をフィルタリングします。def
123
- 正規表現の代わりに文字列マッチングが必要な場合は、次のようになります。
grep { $_ eq "def" || $_ eq "123" } @F
- 正規表現の代わりに文字列マッチングが必要な場合は、次のようになります。
print join " "
grep
スペースを区切り文字として使用して、出力から得られた要素を印刷します。