Bash

如何修改此“printf”程式碼以接受從頭到尾的輸入,或翻轉輸出?

  • May 24, 2019

下面的程式碼可以,例如…

[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列印具有不匹配的行。量子點
  • 現在,如果您要交換列印數組的順序,@Ahash slice @h{...}應該會看到匹配的元素向南移動而不是向北移動。
  • 該程式碼僅列印到標準輸出,您必須將其移回原來的位置:perl '...' file.txt > /tmp/file.txt; mv /tmp/file.txt file.txt

引用自:https://unix.stackexchange.com/questions/520071