我想在一個管道中注入一條命令,該命令只是在該點驗證輸入,如果有效則將其傳遞。 如果無效,則不傳遞任何資訊,或者從一個選項中自定義錯誤資訊或其他東西。
目前,我正在使用 perl 來處理這個問題,在這個例子中,我檢查了一個檔案中的預期的 1美元的唯一匹配:
grep -P '^s*Q$(strip 1)Es ' file_codes.txt
| perl -e '@in = <STDIN>;'.
-e '@in == 1 or die "wrong number of matches";'/span>
-e 'print @in'
| xargs
| ...
我不喜歡這樣,因為它看起來既不像管道,也不像涉及@in的顯式讀取和列印。 似乎有什么東西可以做到這一點,但我并沒有找到它。
uj5u.com熱心網友回復:
grep ... |
perl -e'
defined($line = <>) && !defined(<>)
或 die("錯誤的匹配數量
");
print $line;
' |
xargs ...
當且僅當只有一行輸入時,Perl程式向STDOUT輸出一行。如果沒有確切的一行輸入,它就不向STDOUT輸出任何東西,并向STDERR輸出一個錯誤資訊。
Perl程式盡可能地少讀。這意味著perl和grep都可能提前結束,從而減少對CPU和磁盤的使用。
Perl程式內部和外部的換行符可以被保留或洗掉。
uj5u.com熱心網友回復:
測驗當前輸入的行號,$.(注意,它應該正好是1,所以它被測驗了兩次):
% echo foo | perl -pe 'die "錯誤的匹配數" if $。> 1; END { die "錯誤的匹配數" if $. < 1; }' | xargs
foo
% echo "foo
bar" | perl -pe 'die "錯誤的匹配數量" if $. > 1; END { die "錯誤的匹配數" if $. < 1; }' |xargs
在-e行1,<> 行2.的匹配數量錯誤。
foo
% cat /dev/null | perl -pe 'die "錯誤的匹配數量" if $. > 1; END { die "錯誤的匹配數量" if $. < 1; }' | xargs
在-e行匹配的數量錯誤 1.。
END failed--呼叫佇列中止了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/309923.html
標籤:
上一篇:sed一次處理多行
