Sed

sed 命令的解釋

  • November 7, 2021

我發現了這個有趣的命令:

grep -v '^>' test.fasta | tr -d '\n' | sed -e 's/\(.\)/\1\n/g' | sort | uniq -c | sort -rn

我對它的含義有所了解(它計算文本文件中的字母),但我的問題是關於這個:

sed -e 's/\(.\)/\1\n/g'

我知道它由三個替代命令組成。一種是替換換行符(\n),一個匹配除換行符(\(.\))之外的任何字元,但我迷路了/\1\

命令

sed -e 's/\(.\)/\1\n/g'

是一個單一的 GNUsed替換命令,用它自己替換每個字元,後跟一個換行符。這樣做的效果是將輸入折疊成單個字元的單列。

$ echo hello | sed -e 's/\(.\)/\1\n/g'
h
e
l
l
o

\(.\)是一個“擷取組”,擷取單個字元。這\1是對第一個擷取組的“反向引用”。在替換文本中使用\1將插入第一個括號擷取的任何內容。

它也可以寫成沒有那麼多反斜杠

sed 's/./&\n/g'

其中&僅表示“表達式匹配的任何內容”。

sed命令要求 GNUsed作為標準sed不能插入換行符\n

要使用標準工具更有效地做到這一點,請使用

fold -w 1

反而。這更有效,因為輸入中的每個字元都不需要正則表達式匹配。

使用fold,您的管道可以寫成

grep -v '^>' file | tr -d '\n' | fold -w 1 | sort | uniq -c | sort -rn

或者,使用awk擺脫該管道的幾個步驟,

awk '!/^>/ { for (i = 1; i <= length; ++i) count[substr($0,i,1)]++ }
   END { for (ch in count) print count[ch], ch }' file |
sort -rn

awk程式碼計算每個字元被看到的次數。它通過增加與count輸入流中每個字元對應的數組中的值來實現這一點。在輸入結束時,輸出計數和計數的字元的摘要。

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