[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
你想表达什么

TOP

本帖最后由 CrLf 于 2014-8-16 01:07 编辑
  1. gawk -F"," "FNR==1{sub(/\.[^\.]*$/,\"a^&\",FILENAME)}{print $3,$4,$5>FILENAME}" *.txt
复制代码
内置变量:
FNR 代表相当于文件中的 NR
FILENAME 是当前正在操作的文件名,仅在文件变更时更新
条件执行:
FNR==1 表示当前文件的第一行执行其后的代码块
内置函数:
sub 用于单次替换,有一个 gsub 用于多次替换,若要向后引用则需使用 gensub
输出重定向:
>FILENAME 这就不用解释了吧

TOP

本帖最后由 CrLf 于 2014-8-16 00:14 编辑

如果对 gawk 不熟,不是技术控的话可以用熟悉的脚本来辅助:
批处理
  1. for %%a in (*.txt) do @gawk -F","  "{print $3,$4,$5}" "%%a">"%%~naa%%~xa"
复制代码
powershell
  1. dir *.txt|?{-not $_.PsIsContainer}|%{gawk -F',' '{print $3,$4,$5}' $_.name>$_.basename+'a'+$_.Extension}
复制代码
bash:
  1. for file in *.tar ; do gawk -F','  '{print $3,$4,$5}' $file>${file%.*}a.${file##*.}; done
复制代码
总之哪个顺手用哪个

TOP

本帖最后由 CrLf 于 2014-8-16 01:19 编辑

/\..*?/ 其实我原意是 /\..*?$/ 或者 /\.[^\.]*$/ 的,打漏了...
看来 sub 不支持用 ? 来进行非贪婪匹配,不然应该只会匹配到一个 .,4 楼代码已修改
  1. / 经常用来表示这是个正则表达式,实际的 Pattern 是 \..*?
  2. \. 表示一个 . 字符
  3. .*? 表示任意字符,加 ? 是非贪婪匹配,简单说就是怎么短怎么匹配,而在贪婪模式下就是怎么长怎么匹配
  4. $ 可以匹配行末或文末,与 ^ 对应,^ 代表行首
复制代码
----------------------------------------------
a^&
转义后传递给 gawk 的其实是 a&
  1. a 是要前缀的内容
  2. & 是匹配的内容
复制代码
sed 中也用 & 代表匹配的内容,不知道是不是 posix 标准中约定的,有些语言是用 $0 或者 \0 来指代的,使用 pcre 库实现正则的语言就很可能是用 $0 或 \0 的,比如 perl
----------------------------------------------
假设 FILENAME 为 test.txt,/\..*/ 匹配到的是 .txt,那么 .txt 将被替换成 a& 对应的值: a.txt,所以替换的结果是 testa.txt

TOP

本帖最后由 CrLf 于 2014-8-16 01:26 编辑

各种语言的正则实现略有差别,但区别只在向后引用的写法、是否支持非贪婪匹配、是否支持零宽断言、特殊字符的转义方式等高级用法和语法细节上,据我所知像 . * ? [] {} ^ $ 这些基本的功能都是通用的
用 sed 非常需要懂正则,相比之下 gawk 倒不是很依赖了
这个资料貌似挺全的,我还学到了以前没学过的平衡组/递归匹配用法:
deerchao 的《正则表达式30分钟入门教程》
话说脚本之家的版本竟然比原作者的还新,他是肿么做到的!震精了!

TOP

回复 12# Linuxer


    作者一定不是处女座

TOP

返回列表