簡體   English   中英

Linux:計算文件中的空格和其他字符

[英]Linux: counting spaces and other characters in file

問題:

我需要匹配郵件機軟件程序的確切格式。 它期望某種格式。 我可以計算新行,回車,標簽等的數量。 使用像

cat -vte

od -c

wc -l ( or wc -c )

但是,我想知道字符和文本部分之間的前導和尾隨空格的確切數量。 標簽也是如此。

題:

您將如何分析然后使用常見的unix工具+ perl或python完全匹配模板? 一線人更喜歡。 另外,您對匹配DOS編碼文件的建議是什么? 你會先把它翻譯成NIX,然后按原樣分析或離開嗎?

UPDATE

使用它來查看單個空格[假設文件中沒有'%'字符]:

sed 's/ /%/g' filename.000

計划構建一個分析每行選項卡和空間內容的腳本。

使用@ shiplu的解決方案,向抗貓人群致敬:

while read l;do echo $l;echo $((`echo $l |  wc -c` - `echo $l | tr -d ' ' | wc -c`));done<filename.000

仍然需要對Windows進行一些調整,但它的方式很好。

示范文本

閱讀的關鍵:

標有\\ n的換行符

回車標有\\ r \\ n

標有[:space:]的未知空格/制表符(需要點數)

\r\n
\n
[:space:]Institution Anon LLC\r\n
[:space:]123 Blankety St\r\n
[:space:]Greater Abyss, AK  99999\r\n
\n
\n
[:space:]                                10/27/2011\r\n
[:space:]Requested materials are available for pickup:\r\n
[:space:]e__\r[:space:]                     D_ \r[:space:]   _O\r\n
[:space:]Bathtime for BonZo[:space:]       45454545454545[:space:]  10/27/2011\r\n
[:space:]Bathtime for BonZo[:space:]       45454545454545[:space:]  10/27/2011\r\n
\n
\n
\n
\n
\n
\n
[:space:]                             Pantz McManliss\r\n
[:space:]                             Gibberish Ave\r\n
[:space:]                             Northern Mirkwood, ME  99999\r\n
( untold variable amounts of \n chars go here )

更新2

將IFS與read一起使用會給下面某人發布的ruby提供類似的結果。

while IFS='' read -r line
 do 
     printf "%s\n" "$line" | sed 's/ /%/g' | grep -o '%' | wc -w
 done < filename.000
perl -nlE'say 0+( () = /\s/g );'

與當前接受的答案不同,這不會將輸入拆分為字段,從而丟棄結果。 它也不會不必要地創建一個數組來計算列表中的值的數量。

使用的習語:

  • 0+( ... )強加標量上下文,如scalar( ... ) ,但它更清晰,因為它告訴讀者一個數字是預期的。
  • 標量上下文中的列表賦值返回其RHS返回的元素數,因此0+( () = /.../g )給出匹配的次數() = /.../g
  • -l-n使用時,會導致輸入“chomped”,因此會從計數中刪除換行符。

如果您只對空間(U + 0020)和制表符(U + 0009)感興趣,則以下內容更快更簡單:

perl -nE'say tr/ \t//;'

在這兩種情況下,您都可以通過STDIN或通過參數命名的文件傳遞輸入。

Perl或Python中的正則表達式將是這里的方法。

是的,可能需要花費初始時間來學習“perl,schmerl,zwerl”,但是一旦你獲得了像Regular Expressions這樣非常強大的工具的經驗,它可以為你節省大量的時間。

在此輸入圖像描述

計算空白:

sed 's/[^ ]//g' FILE | tr -d "\n" | wc -c

文本之前,之后和之間。 您是想在同一個計划中計算換行符,制表符等並將它們相加,還是作為單獨的步驟?

perl -nwE 'print; for my $s (/([\t ]+)/g) { say "Count: ", length $s }' input.txt

這將計算制表符或空格的各個組,而不是計算整行中的所有空格。 例如:

    foo        bar

會打印

    foo        bar
Count: 4
Count: 8

您可能希望跳過單個空格(單詞之間的空格)。 即不要計算Bathtime for BonZo空間。 如果是這樣,請將+替換為{2,}或您認為合適的最小值。

如果你想計算pm.txtspace數,這個命令會做,

 cat pm.txt | while read l; 
 do echo $((`echo $l |  wc -c` - `echo $l | tr -d ' ' | wc -c`));
 done;

如果你想計算space數s, \\r\\n\\t使用這個,

cat pm.txt | while read l;
do echo $((`echo $l |  wc -c` - `echo $l | tr -d ' \r\n\t' | wc -c`));
done;

read將刪除任何前導字符。 如果你不想要它,那就有一種討厭的方式。 首先拆分文件,使每個文件只使用1行

`split -l 1 -d pm.txt`. 

之后會有一堆x*文件。 現在循環它。

for x in x*; do echo $((`cat $x |  wc -c` - `cat $x | tr -d ' \r\n\t' | wc -c`)); done;

rm x*刪除那些文件;

如果Ruby計數(它確實計數 :)

ruby -lne 'puts scan(/\\s/).size'

現在有些Perl(稍微不那么直觀的恕我直言):

perl -lne 'print scalar(@{[/(\\s)/g]})'

如果你問我,我會寫一個簡單的C程序來一次性完成計數和格式化。 但那只是我。 當我用perl,schmerl,zwerl完成小提琴放屁時,我已經浪費了半天時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM