[20210819]給檔案內容編行號.txt

lfree發表於2021-08-19

[20210819]給檔案內容編行號.txt

--//昨天在小區裡被一位老者攔下,請求處理一個小問題,給一個檔案內容編行號。
--//實際上就是隨身碟裡面有一堆MP3檔案,使用MP3播放器時,只要輸入數字就能播放對應歌曲。
--//這個問題對於我很簡單,不過麻煩的是對方機器是windows XP環境,沒有nl,cat之類的命令。
--//上網安裝unxutils包,安裝後執行如下:
nl mp3.txt > mp3a.txt
cat -n mp3.txt> mp3a.txt

--//不過對方測試按對應數字播放的歌曲對應不上,我估計他可能往隨身碟新增MP3檔案,導致順序發生變化。
--//重新生成後再編排,執行如下:
dir /s/b *.mp3 | nl > mp3a.txt

--//再次測試,問題搞定。回家後上網查詢到如下連結:
https://www.cnblogs.com/kerrycode/p/12781340.html =>Linux shell中如何給文字加上行號呢

--//awk 可以執行如下:
$ awk '{ print FNR " " $0}' redo_anly_script.sql

--//sed呢?我自己以前寫過:
[20201202]sed加行號.txt

--//連結提供一些加行號的方法:http://www.itpub.net/thread-2140068-1-1.html
--//想使用sed實現,上網看了一下:

R:\>cat a.txt
this is a test 1
this is a test 2
this is a test 3
this is a test 4

R:\> sed "=" a.txt | sed "N;s/\n/ /"
1 this is a test 1
2 this is a test 2
3 this is a test 3
4 this is a test 4

--//有點麻煩。透過例子展開分析。

D:\>c:\windows\system32\echo 111\n222\n333\n
111
222
333

D:\>c:\windows\system32\echo 111\n222\n333\n | sed =
1
111
2
222
3
333
4

--//等號實際上輸出行號,但是出現換行。
D:\>c:\windows\system32\echo 111\n222\n333 | sed = | paste -d" " - -
1 111
2 222
3 333

--//sed "N;s/\n/ /" ,這裡分成2個命令,N是兩行連線起來;s/\n/ /替換中間的\n使用空格。這類的命令不常用,基本記不住。

--//在vim下如何完成呢?vim下有一個外掛Inc,我的機器已經安裝這個外掛:
: help Inc

:[line1,line2]Inc [s<number>] [i<number>] [r<number>] [w<number>] [h] [o] [p<regexp>] [w<number>] [c]
   STARTING  [s<number>]:  to change the starting value
                           (default: 0)
   INCREMENT [i<number>]:  to increase the value by this amount between matches
                           (default: 1)
   REPEAT    [r<number>]:  to increase the value after <number> matches
                           (default: 1)
   WIDTH     [w<number>]:  to align all the numbers to the right with the given width
                           (default: 4)
   FILLER    [f<char>]:    to align numbers to the right, use the given character
   HEX       [h]:          to use a hexadecimal base
   OCTAL     [o]:          to use an octal base
   PATTERN   [p<regexp>]:  if not using w parameter:
                               to replace the pattern
                           if using w parameter:
                               to search the line that matches the pattern and change a specific word
                           NOTE: with regexp be careful to use \ before spaces and \\ to place a literal \
   CONFIRM   [c]        :  to confirm each substitution; one to confirm before, two to confirm before AND after.
                           (default: not active)
   NOTE: The default values can be changed.

--//看了一下例子很簡單,執行如下:
:%s/^/@ /
:%Inc s1 i1 w4

--//當然應該還有許多方法,我在自己cygwin下測試:
$ paste -d" " <(seq $(wc -l <aa.txt)) <( cat aa.txt)
1 altair:x:1001:1001:Altair Ibn La Ahad,,,,:/home/altair:/bin/bash
2 bind:x:120:132::/var/cache/bind:/bin/false
3 dnsmasq:x:121:65534:dnsmasq,,,:/var/lib/misc:/bin/false
4 mysql:x:115:129:MySQL Server,,,:/nonexistent:/bin/false
5 postfix:x:105:126::/var/spool/postfix:/bin/false
6 raghu:x:1000:1000:raghu,,,:/home/raghu:/bin/bash
7 smmsp:x:119:131:Mail Submission Program,,,:/var/lib/sendmail:/bin/false
8 smmta:x:118:130:Mail Transfer Agent,,,:/var/lib/sendmail:/bin/false
9 sshd:x:117:65534::/var/run/sshd:/usr/sbin/nologin
10 statd:x:116:65534::/var/lib/nfs:/bin/false

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2787888/,如需轉載,請註明出處,否則將追究法律責任。

相關文章