考慮的一個版本grep
(如GNU grep
)由-P
選項和支持-o
選項啓用只打印什麼的匹配與PCRE(Perl兼容的正則表達式)的支持 - 無論它是由POSIX規定 - 那麼你需要在管道前放置反斜槓,並在問題中命令的第二個雙引號之前加一個空格。
鑑於數據文件:
something1
something2 username": "John" something3
something4
....
something5 salaryunit="dollar" something6
something7
username": "John" salaryunit="dollar"
運行中所示的命令產生所示的輸出:
$ grep -oP 'username": ".*?"|salaryunit=".*?"' file
username": "John"
salaryunit="dollar"
username": "John"
salaryunit="dollar"
$
注意,當圖案上輸入的一行(最後在兩次相匹配樣本數據),則-o
選項會在兩條單獨的行上輸出兩個單獨的匹配項。當匹配輸入在兩條獨立的線上時,當然,輸出也在兩條獨立的線上。
如果您要求'在單行上輸出',則需要指定想要作爲擴展文件的輸出的結果,還是要指定文件的二十個匹配文件的變體。如果您希望成對使用兩個條目,如果在兩個條目之間沒有salaryunit
條目或兩個salaryunit
條目之間沒有username
條目或沒有username
,會發生什麼情況?等
如果你有信心,項目總是成對出現,並且總是在序列username
然後salaryunit
,然後讓對線合併成單條線中的簡單的方法是:
$ grep -oP 'username": ".*?"|salaryunit=".*?"' file | paste -d ' ' - -
username": "John" salaryunit="dollar"
username": "John" salaryunit="dollar"
$
的- -
表示法paste
表示'從標準輸入讀取一行然後第二行並將組合打印爲單行'。默認情況下,行由製表符分隔;使用-d ' '
意味着它們被一個空格分開。使用更長的分隔符不起作用;第一個字符用於分隔前兩個字段,字符串中的第二個字符分隔第二個和第三個字段,依此類推。
感謝喬納森,它配對,我有很多文件,每個文件都有'用戶名'和'salaryunit',你能幫我把他們在一行結果 –
你必須定義我最後一段中列出的所有問題在我明智地幫助將結果寫入單一行之前,再加上問題(1)'用戶名'總是出現在'salaryunit'?之前,並且(2)'每個文件每個關鍵字只包含一個條目? 「請編輯問題以添加額外信息 - 請勿將其添加爲註釋。 –
是的,喬納森,這是肯定的,'用戶名'總是在'salaryunit'之前,每個文件只包含每個關鍵字的一個條目 –