Bash
如何修改此“printf”程式碼以接受從頭到尾的輸入,或翻轉輸出?
下面的程式碼可以,例如…
[anony@mous-pc ~]$ (printf 'g?%s?m0\n' 008 006 004 002 ; printf 'wq\n') | ed -s file.txt
…取…內的所有數字
[anony@mous-pc ~]$ cat file.txt 005 003 110 069 002 008 004 245 009 007 006
…並將所需的數字(或其他字元串)移到頂部,但以執行程式碼的相反順序…
[anony@mous-pc ~]$ cat file.txt 002 004 006 008 005 003 110 069 245 009 007
…只要您將順序顛倒過來,順序就會從頭到尾(相反的順序),或者…其他人可能會稱之為從上到下的格式…所以再一次,實現先到最後一個命令我必須以這種方式執行……
[anony@mous-pc ~]$ (printf 'g?%s?m0\n' 008 006 004 002 ; printf 'wq\n') | ed -s file.txt
但是,一個人如何按照他們打算從頭到尾的順序輸入他們的數字(或字元串)並且仍然實現從頭到尾的順序?
如果無法更改輸入結果,是否
sed
可以更改輸出結果並在保存前翻轉或反轉它們file.txt
?
$ perl -lne ' /00[2468]$/ ? $h{$_} : $A[@A] = $_; }{ print for @h{qw/008 006 004 002/}, @A; ' file.txt
儲存在單獨的容器中匹配和不匹配的行。到了列印它們的時候,從匿名數組中提取訂單,鍵入散列 %h。
解釋:
- 正如我們在每一行中閱讀的那樣,查看它是否包含匹配行,以 2、4、6 或 8 結尾的那些。將它們儲存在雜湊
%h
中,鍵是整個匹配行$h{$_}
。- OTW,如果不匹配,將不匹配的行推到數組的後面
@A
。- 在我們看到文件結尾之後,我們
%h
首先列印雜湊。如您所知,雜湊的訪問本質上是隨機的。但我們必須下達命令,因為這是您的要求之一。因此,我們通過按照您希望它們出現的順序列出鍵來規定順序:qw/008 006 004 002/
這是一個匿名數組。這將列印$h{008}
,然後$h{006}
以此類推。- 之後
array @A
列印具有不匹配的行。量子點- 現在,如果您要交換列印數組的順序,
@A
您hash slice @h{...}
應該會看到匹配的元素向南移動而不是向北移動。- 該程式碼僅列印到標準輸出,您必須將其移回原來的位置:
perl '...' file.txt > /tmp/file.txt; mv /tmp/file.txt file.txt