无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 444|回复: 17
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 3 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tools241 于 2025-5-31 10:42 编辑

* 在 windows 下可下载 "仿unix/linux命令", 其中也有 sed.exe 可用
* 在 unix/linux 大多数复杂的批次处理都可以不用设计程式来达成
* 如果在 unux/linux 可以用 sed 命令来编辑大量的文字档
* Dos文档转Unix文档 -- dos2unix.exe 档名
* Unix文档转Dos文档 -- unix2dos.exe 档名

UnxUtils仿unix命令.7z  1.9M
载点1: https://e.pcloud.link/publink/sh ... dX5jcAjEti4AhbTlN3k
载点2: (tools 工具), 2021/08/15新链接: https://pan.baidu.com/s/1jWSrJx2Q_BkAadI1eSTHQQ 提取码: jsq4

含 cat, cmp, cp, dc, dd, diff, echo.exe, expr, find.exe, gawk, grep、sed, sleep, sort, split,
test, touch, tr, wc, ...... 等122个 exe

________________________________________________________


* 范例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 档名


2#
发表于 3 天前 | 只看该作者
感谢分享
回复

使用道具 举报

3#
发表于 3 天前 | 只看该作者
感谢付出,谢
回复

使用道具 举报

4#
发表于 3 天前 | 只看该作者
感谢分享 好人一生平安
回复

使用道具 举报

5#
发表于 3 天前 | 只看该作者
谢楼主分享
回复

使用道具 举报

6#
发表于 3 天前 | 只看该作者
谢谢楼主大放送
回复

使用道具 举报

7#
发表于 3 天前 | 只看该作者
好像看到正则了,[0-9][0-9]好像可以写成[0-9]{2}?


二○二五年五月三十日
回复

使用道具 举报

8#
发表于 3 天前 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

9#
发表于 3 天前 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

10#
发表于 3 天前 来自手机 | 只看该作者
不想用百度网盘,能123网盘分享吗?另问一下:其它Linux command:grep、find、cat......编译有Windows版吗?

点评

cat, cmp, cp, dc, dd, diff, echo.exe, expr, find.exe, grep、sed, sleep, sort, split, test, touch, tr, wc,... https://e.pcloud.link/publink/show?code=kZCen2ZnGOn4CVQOdX5jcAjEti4AhbTlN3k  详情 回复 发表于 前天 10:37
回复

使用道具 举报

11#
发表于 3 天前 | 只看该作者
请问楼主,有这些命令的说明吗?有链接或网站或论坛不?谢谢分享,谢谢楼主打开思路!
回复

使用道具 举报

12#
发表于 3 天前 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

13#
发表于 3 天前 | 只看该作者
感谢楼主分享
回复

使用道具 举报

14#
发表于 前天 06:43 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

15#
 楼主| 发表于 前天 10:37 | 只看该作者
砌你生猪肉 发表于 2025-5-30 14:42
不想用百度网盘,能123网盘分享吗?另问一下:其它Linux command:grep、find、cat......编译有Windows版吗 ...

cat, cmp, cp, dc, dd, diff, echo.exe, expr, find.exe, grep、sed, sleep, sort, split, test, touch, tr, wc,...

https://e.pcloud.link/publink/sh ... dX5jcAjEti4AhbTlN3k

点评

多谢大佬!可惜,这边Android使用chrome访问不了这个云盘,能否放到223。另外,请教,这些是否command64位的。  详情 回复 发表于 前天 13:39
回复

使用道具 举报

16#
发表于 前天 13:39 | 只看该作者
tools241 发表于 2025-5-31 10:37
cat, cmp, cp, dc, dd, diff, echo.exe, expr, find.exe, grep、sed, sleep, sort, split, test, touch,  ...

多谢大佬!可惜,这边Android使用chrome访问不了这个云盘,能否放到223。另外,请教,这些是否command64位的。

点评

hzyry2046,ysepan,com 在杂项里的unxutils... 另外我重庆电信访问该站正常。  详情 回复 发表于 前天 17:28
仿unix命令都是32位元.  详情 回复 发表于 前天 17:22
回复

使用道具 举报

17#
 楼主| 发表于 前天 17:22 | 只看该作者
本帖最后由 tools241 于 2025-5-31 17:26 编辑
砌你生猪肉 发表于 2025-5-31 13:39
多谢大佬!可惜,这边Android使用chrome访问不了这个云盘,能否放到223。另外,请教,这些是否command64 ...

仿unix命令都是32位元, 在 Windows 使用.
pcloud 在Windows 可下载.
其他云盘须找人分流.


回复

使用道具 举报

18#
发表于 前天 17:28 | 只看该作者
砌你生猪肉 发表于 2025-5-31 13:39
多谢大佬!可惜,这边Android使用chrome访问不了这个云盘,能否放到223。另外,请教,这些是否command64 ...

hzyry2046,ysepan,com
在杂项里的unxutils...
另外我重庆电信访问该站正常。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-6-2 07:11

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表