close

如何利用 仿unix命令 sed 一次替換文字中的 "某些相似性的字串"


* 如果在 windows 下可下載 "仿unix/linux命令", 其中也有 sed.exe 可用
* 在 unix/linux 大多數複雜的批次處理都可以不用設計程式來達成
* 如果在 unux/linux 可以用 sed 命令來編輯大量的文字檔
* Dos文檔轉Unix文檔 -- dos2unix.exe 檔名
* Unix文檔轉Dos文檔 -- unix2dos.exe 檔名

windows下安裝 UnxUtils -- 仿 unix/linux 命令 ==>

https://tools241.pixnet.net/blog/post/570334624
_________________________________________________________


* 範例1:將 小說.txt 分割成3等份左右:


Yahoo 知識家問題:
發問時間:    2013-10-17 23:17:57
解決時間:    2013-10-18 10:35:19
 http://tw.knowledge.yahoo.com/question/question?qid=1013101705724

REM 將 小說.txt 分割成3等份左右,  split3.bat 內容如下 :
REM 利用 仿unix命令 :
REM 1.計算行數用法 wc.exe --help
REM 2.改字串用法 sed.exe --help
REM 3.計算用法 expr.exe --help
REM 4.分割用法 split.exe --help

REM 計算 expr 行數 / 3  的值, 存到 tmp.txt
echo @echo off > tmp.bat
wc -l 小說.txt  | sed -e "s: *\([0-9][0-9]*\).*:expr \1 / 3:" >> tmp.bat
call tmp.bat > tmp.txt

REM 產生 split.exe -行數 input.txt  output_
sed -e "s:\(.*\):split.exe -\1 小說.txt  output_:" < tmp.txt >  tmp.bat

call tmp.bat

move output_aa   小說_1.txt
move output_ab   小說_2.txt
move output_ac   小說_3.txt
del tmp.txt
del tmp.bat

* 註解:
sed.exe -e "編輯指令" < 輸入檔 > 輸出檔
編輯指令中有 "s/找字串一/改成字串二/" 或 "s:找字串一:改成字串二:" ,
 其中 s 表示 "替代"
 找字串一 http.*\/\([0-9][0-9]*\)\.[jJ][pP][gG] , 其中
  .  表示 "任意字",  *  表示 "前面的字出現任意次數", 因此
  .*  表示 "任意字出現任意次數"
 \ 表示 將其後的字的意義 "取消 或 另做不同的解釋" , \/ 表示 / ,
 \([0-9][0-9]*\) 表示將 \(  \) 的內容存到字串二的 \1 中 ,
 [0-9]  表示一個字為範圍介於0-9之間的數字,
 [0-9]* 表示數字重複出現任意次(含零次) ,
 \. 表示一個字 .
 [jJ] 表示一個字內容為 j 或 J

_________________________________________________________

 

* 範例2:假設有一個檔案 c:\input.txt 內容如下:
<a href=http://hgdyv.bay.livefilestore.com/mdfkjfbvfjgnkkk485tu89-gnfsji83-gjde_/1.jpg>
<a href="http://hgdyv.bay.livefilestore.com/123gnkkk485tu89-gnfsji83-gjde_/52.jpG">
<a href="http://www.abcdef.com/d3nj6-_R/903.JPg">

  要將存放的網址全部替換, 最後產生 c:\output.txt 內容如下:
<a href="http://www.name.com.tw/1.JPG">
<a href="http://www.name.com.tw/52.JPG">
<a href="http://www.name.com.tw/903.JPG">


則利用以下命令便可編輯出所要的結果:

sed.exe -e "s/http.*\/\([0-9][0-9]*\)\.[jJ][pP][gG]/http:\/\/www.name.com.tw\/\1.JPG/" < c:\input.txt > c:\output.txt

執行完便產生 c:\output.txt 內容為:
<a href=http://www.name.com.tw/1.JPG>
<a href="http://www.name.com.tw/52.JPG">
<a href="http://www.name.com.tw/903.JPG">


* 註解:
sed.exe -e "編輯指令" < 輸入檔 > 輸出檔
編輯指令中有 "s/找字串一/改成字串二/" 或 "s:找字串一:改成字串二:" ,
 其中 s 表示 "替代"
 找字串一 http.*\/\([0-9][0-9]*\)\.[jJ][pP][gG] , 其中
  .  表示 "任意字",  *  表示 "前面的字出現任意次數", 因此
  .*  表示 "任意字出現任意次數"
 \ 表示 將其後的字的意義 "取消 或 另做不同的解釋" , \/ 表示 / ,
 \([0-9][0-9]*\) 表示將 \(  \) 的內容存到字串二的 \1 中 ,
 [0-9]  表示一個字為範圍介於0-9之間的數字,
 [0-9]* 表示數字重複出現任意次(含零次) ,
 \. 表示一個字 .
 [jJ] 表示一個字內容為 j 或 J


_________________________________________________________


* 範例3:假設有一個檔案 c:\input.txt 內容如下:
abcd:001:a2222:efgh:wert:99
xxyyzz:0002:b333:ccddee:pppp:756

  每行有數個欄位以 : 隔開,要將每行的第2欄與第3欄位置互換,最後產生 c:\output.txt 內容如下:
abcd:a2222:001:efgh:wert:99
xxyyzz:b333:0002:ccddee:pppp:756


則利用以下命令便可編輯出所要的結果:

sed.exe -e "s/\([ -9;-~][ -9;-~]*\):\([ -9;-~][ -9;-~]*\):\( -9;-~][ -9;-~]*\):\(.*\)/\1:\3:\2:\4/" < c:\input.txt > c:\output.txt


* 註解:
sed.exe -e "編輯指令" < 輸入檔 > 輸出檔
編輯指令中有 "s/找字串一/改成字串二/" , 其中 s 表示 "替代"
   其中  [ -9;-~]  表示 " : 以外的任意字",
    *  表示 "前面的字出現任意次數", 因此
    [ -9;-~]*  表示 "除了 : 外任意字出現任意次數" ,
    字串一之中的第1組 \(  \) 的內容存到字串二的 \1 中 ,
    字串一之中的第2組 \(  \) 的內容存到字串二的 \2 中 ,
    字串一之中的第3組 \(  \) 的內容存到字串二的 \3 中 ,
    字串一之中的第4組 \(  \) 的內容存到字串二的 \4 中 .

_________________________________________________________
 
* 範例4:假設有一個檔案 c:\input.txt 內容如下:
abcd:001:2222:efgh:wert
xxyyzz:0002:333:ccddee:pppp

  每行有數個欄位以 : 隔開,將每行的第2欄位相加顯示總和在螢幕.


則利用以下命令(echo, sed, dc )便可得出所要的結果:

echo 0 > c:\output.txt
sed.exe -e "s/[ -9;-~][ -9;-~]*:\([ -9;-~][ -9;-~]*\):.*/\1+/" < c:\input.txt >> c:\output.txt
echo p >> c:\output.txt
dc.exe < c:\output.txt

* 註解:
echo 0 > c:\output.txt 表示存一個字 "0" 到 c:\output.txt
sed.exe -e "編輯指令" < 輸入檔 >> 輸出檔(不清除舊檔直接併入)
編輯指令中有 "s/找字串一/改成字串二/" , 其中 s 表示 "替代"
   其中  [ -9;-~]  表示 " : 以外的任意字",
    *  表示 "前面的字出現任意次數", 因此
    [ -9;-~]*  表示 "除了 : 外任意字出現任意次數" ,
    字串一之中的第1組 \(  \) 的內容存到字串二的 \1 中 ,
echo p >> c:\output.txt 表示存一個字 "p" 到 c:\output.txt文末.
   因此 c:\output.txt 的 內容如下:
0
001+
0002+
p

dc < c:\output.txt  會將 0 001 0002 相加 再 print 加總結果 3 到螢幕
dc 為後置式桌上計算器, 請參考 ==>
   
    dc.c (仿unix命令dc, 後置式計算機) ------ Mike Wang
 
_________________________________________________________
 
* 範例5:如何把input.txt文件內容以列倒排(但每列文字不變):

  利用以下命令(sed , sort)便可得出所要的結果:

sed.exe -e "s/^/0/" < c:\input.txt | sort.exe  -r  -k  1,1 | sed.exe -e "s/0//" > c:\output.bat
 
* 註解: 利用sed在每列開頭加一個字, 例如 "0", 再用sort反向排序, 最後將每列的第一個字刪除.
 
編輯指令 sed.exe -e  "s/找字串一/改成字串二/" , 其中 s 表示 "替代"
其中
  ^  表示 "每列的開頭",  不佔字數.

排序指令 sort.exe
     -r 表示反向排序
     -k  1,1 表示只比較第1個字
欲了解sort.exe的用法請打:
sort  --help


_________________________________________________________
 
* 範例6:假設有一個檔案 c:\input.txt 內容如下:
1234567890abcd
xxyyzz:0002:333:ccddee:pppp

  取出第1列的前3個字, 並檢查是否為 "123" :
 
則利用以下命令(sed , expr)便可得出所要的結果:

sed.exe -e "2,$d" -e "s/\(...\).*/expr 123 = \1/" < c:\input.txt > c:\check123.bat
 
* 註解:
編輯指令 -e "2,$d" 表示刪除第2列至最後列.
編輯指令 -e  "s/找字串一/改成字串二/" , 其中 s 表示 "替代"
其中
  .  表示 "任意字",  *  表示 "前面的字出現任意次數", 因此
  .*  表示 "任意字出現任意次數"
   字串一之中的第1組 \(  \) 的內容存到字串二的 \1 中 ,
  因此 c:\check123.bat 的 內容如下:
expr 123 = 123
執行check123.bat 若相等的return值為 1 ; 若不相等則return值為 0


_________________________________________________________

* 範例7:假設有C:\1\1.txt 和 C:\1\1.bat 和 C:\2
           1.txt內只有號嗎00027, 當我連行1.bat, 會創建交件夾C:\2\00027, 之後會把txt內的00027改成00028.
            (每次都增加一個數字, 來等待下一次使用時創建00028交件夾).


REM 利用 仿unix命令(請將下列3個*.EXE檔複製過來使用 ) :
REM 1.改字串用法 sed.exe  --help
REM 2.計算用法   expr.exe  --help
REM 3.顯示字串   echo.exe  --help

編輯 1.BAT 如下:

@echo off

echo.exe @echo off\n > tmp.bat

rem ^ 表示為文字開頭
sed.exe -e "s/^/md C:\2\/" < C:\1\1.txt >> tmp.bat
echo.exe \n >> tmp.bat

sed.exe -e "s/^/expr.exe 100001 + /" < C:\1\1.txt >> tmp.bat
echo.exe \n >> tmp.bat

REM . 為任意一個字
tmp.bat |  sed.exe -e "s/.//" > C:\1\1.txt

_________________________________________________________

* 範例8:找出所有的 *.GHO 檔, 將清單存到 C:\tmp.txt
del   /Q   C:\tmp.txt 2>nul >nul
for %%i in ( A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ) do find_Unix.exe %%i\   |   tr.exe "\n" "?" | sed -e "s:?:?/:g" | tr "?" "\r" | tr "/" "\n" | grep.exe "\.[Gg][Hh][Oo]$" >> C:\tmp.txt

註: 本例中已將仿Linux的find.exe改名為find_Unix.exe以免與Windows系統的find.exe同名產生混淆.
列出 C:\ 下的所有檔案清單                                                                                                                                                       -- find_Unix.exe C:\
將每一行中Linux的new line碼(Ctrl+j)換成 ?                                                                                            -- tr.exe "\n" "?"
將全部的 ? 改成 ?/ ( s 表示 "替代" , g 表示全部而非一個 )                                    -- sed.exe -e "s:?:?/:g"  
將每一行中 ?/ 換成 Windows的return(Ctrl+M)碼 + new line碼(Ctrl+j)   -- tr.exe "?" "\r" | tr "/" "\n"
找出 "行末" 含 .GHO  或 *.gho 的各行( $ 表示位於最後 )                                               -- grep.exe "\.[Gg][Hh][Oo]$"

2017/09/17 再增加文檔轉換工具 UNIX2DOS 及 DOS2UNIX:
Dos文檔轉Unix文檔 -- dos2unix 檔名
Unix文檔轉Dos文檔 -- unix2dos 檔名

_________________________________________________________
本文出自: https://tools241.pixnet.net/blog

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 tools241 的頭像
    tools241

    tools241 異次元空間幻境

    tools241 發表在 痞客邦 留言(0) 人氣()