iT邦幫忙

DAY 22
2

回應鐵人賽的文章變鐵人系列 第 22

[Reply] 在Linux環境下,每行的開頭或結尾的字串處理,很簡潔

thc 在 VB6之迴光返照 系列文中,
提及 VB6 如何把檔案中的每行的前面幾個字元刪除,
每行前頭或後面加字串的解決方案;
而類似這樣的處理字串問題,
Linux 的工具程式,透過簡單的語法即能完成。
每行前加行號
假設一段程式碼的檔案 raw.txt 內容為:

    Open App.Path & "\log.txt" For Output As #1 '存到log.txt
    Print #1, TxtMain    'strsql是變數名稱
    Close #1
    Dim a, i, intN
    intN = InputBox("請輸入 n 的值", "請輸入 n 的值", 1)
    Open App.Path & "\log.txt" For Input As #1 '載入 檔案 log.txt
    While Not EOF(1)
        Line Input #1, a
        List1.AddItem a '增加list1.additem
    Wend
    Close #1

要加上行號的話,

awk '{print NR"."$0}' raw.txt
awk '{length(NR)==1?no="0"NR:no=NR; print no"."$0}' raw.txt

上面兩行指令都可自行加行號,
第二行只是對行號為單位數,前面補個零。

刪除各行的行號
而要把各行號給刪除,
類似像這樣的內容:

08.        Line Input #1, a
09.        List1.AddItem a '增加list1.additem
10.    Wend
11.    Close #1

可以用以下的方式來把前面的行號清除掉。

sed -e 's/^[0-9]*\.//g' raw2.txt

各行之前或後加字串
用 awk 或 sed 都非常容易,

#前頭加個 ☆ 字串
awk '{print "☆"$0}' filename
sed -e 's/\(.*\)/☆\1/g' filename
#每行後加 ☆ 字串
awk '{print $0"☆"$' filename
sed -e 's/\(.*\)/\1☆/g' filename

用ruby程式處理
上述是用Linux內建的工具執行,
如果是要程式來做這些事的話,
大概也可以用一行的方式就解決了:
編輯一個檔案叫 add.rb 內容為:

File.read(ARGV[0]).split("\n").each {|line| puts "☆#{line}"}

執行 ruby add.rb filename 就會每行前面加個星號印出。

若要除行號,內容為:

File.read(ARGV[0]).split("\n").each {|line|puts line.gsub(/^\d+\./,'')}

同上面的執行方式,
就可把前面的行號給清除掉。

純就 文字處理 的議題而言,
Linux所提供的環境是相當簡潔的。

系列文章


上一篇
[Reply] 如何在vim裡用拼字檢查
下一篇
[Reply] 你應知道的 Unix 工具:Pipe Viewer
系列文
回應鐵人賽的文章變鐵人30

尚未有邦友留言

立即登入留言