【发布时间】:2016-07-13 15:37:15
【问题描述】:
关于我工作环境的信息:
$ uname -a
AIX prd231 1 6 00C6B1F74C00
$ oslevel -s
6100-03-10-1119
代码块 A
( grep schdCycCleanup $DCCS_LOG_FILE | sed 's/[~]/ \
/g' | grep 'Move(s) Exist for cycle' | sed 's/[^0-9]*//g' ) > cycleA.txt
代码块 B
( grep schdCycCleanup $DCCS_LOG_FILE | sed 's/[~]/ \n/g' | grep 'Move(s) Exist for cycle' | sed 's/[^0-9]*//g' ) > cycleB.txt
我有两个代码块(如上所示),它们使用 sed 将输入修剪到 6 位,但一个命令的行为与我的预期不同。
两个代码块的输入示例
Mar 25 14:06:16 prd231 ajbtux[33423660]: 20160325140616:~schd_cem_svr:1:0:SCHD-MSG-MOVEEXISTCYCLE:200705008:AUDIT:~schdCycCleanup - /apps/dccs/ajbtux/source/SCHD/schd_cycle_cleanup.c - line 341~ SCHD_CYCLE_CLEANUP - Move(s) Exist for cycle 389210~
当上面的示例输入通过两个代码块时,我得到以下输出。
cycleA.txt 内容
389210
cycleB.txt 内容
25140616231334236602016032514061610200705008341389210
我知道我的最后一个管道 sed 命令 (sed 's/[^0-9]*//g') 正在删除除数字以外的所有字符,所以我从块代码中省略了它,并将输出放在另外两个文件。我得到以下输出。
cycleA1.txt 内容
SCHD_CYCLE_CLEANUP - Move(s) Exist for cycle 389210
cycleB1.txt 内容
Mar 25 15:27:58 prd231 ajbtux[33423660]: 20160325152758: nschd_cem_svr:1:0:SCHD-MSG-MOVEEXISTCYCLE:200705008:AUDIT: nschdCycCleanup - /apps/dccs/ajbtux/source/SCHD/schd_cycle_cleanup.c - line 341 n SCHD_CYCLE_CLEANUP - Move(s) Exist for cycle 389210 n
我可以看到第一个代码块正在删除除 (SCHD_CYCLE_CLEANUP - Move(s) Exist for cycle 389210) 之外的所有内容,并且正在使用波浪号,但第二个代码块只是将波浪号替换为字符 n。我还可以看到,在此之后的第一个代码块中需要换行(sed 's/[~]/),这就是为什么我虽然有 \n 会模拟换行但事实并非如此。我认为我不同的输出结果是因为使用正则表达式的方式。我试图研究正则表达式并在stackoverflow上搜索它们,但没有得到我想要的东西。有人能解释一下我如何从代码块 B 中获得与代码块 A 相同的结果,而无需将我的部分代码放在第二行吗?
提前谢谢你
【问题讨论】:
-
您使用的是什么版本的
sed?我有 4.2.1 版本,并且使用sed表达式得到相同的结果。 -
您能否使用代码格式而不是引号格式重新格式化示例输入和输出,以确保换行符/等。显示正确吗?
-
这是一个很好的问题,但它被埋没了。请考虑创建一个MCVE (Minimal, Complete, and Verifiable Example)。
-
你好 lurker,我尝试了 sed -V 和 -version 但没有得到任何东西,所以我寻找我的 unix 机器的版本:
uname -a AIX prd231 1 6 00C6B1F74C00和oslevel -s 6100-03-10-1119 -
你好,Etan,完成了。