regex - 下面的两个 sed 命令有什么区别?

标签 regex unix sed ksh aix

关于我工作环境的信息:

$ 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') 正在删除除数字以外的所有字符,所以我从 block 代码中省略了它并将输出放在另外两个文件。我得到以下输出。

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 替换波浪号。我还可以看到在 this(sed 's/[~]/) 之后的第一个代码块中有必要换行,这就是为什么我虽然有\n 会模拟换行但事实并非如此。我认为我不同的输出结果是因为正则表达式的使用方式。我试图研究正则表达式并在 stackoverflow 上搜索它们,但没有得到我想要的东西。有人可以解释我如何从代码块 B 获得与代码块 A 相同的结果,而无需将我的部分代码放在第二行吗?

提前致谢

最佳答案

这是 XY 问题 (http://xyproblem.info/) 的示例。您正在寻求帮助来实现某些对您的问题来说是错误的解决方案。为什么要将 ~ 更改为换行符等,而在给定发布的示例输入和预期输出的情况下,您只需要:

$ sed -n 's/.*schdCycCleanup.* \([0-9]*\).*/\1/p' file
389210

或:

$ awk -F'[ ~]' '/schdCycCleanup/{print $(NF-1)}' file
389210

如果这不是您需要的全部,那么请编辑您的问题以阐明您对WHAT 的要求(而不是您尝试做的方式),因为您当前的方法只是错了。

关于regex - 下面的两个 sed 命令有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36227417/

相关文章:

regex - sed regex - 将标题大小写转换为驼峰大小写

regex - "grep -v ' ^ $' file.txt"在做什么?

unix - 如何使用 sed 追加到现有行

c++ - 自动将 C/C++ 源代码划分为分布式应用程序

ruby - 在多个文件(大数据)上搜索和替换正则表达式

linux - 如何使用sed命令提取数据

javascript - 正则表达式匹配摩托车名称并分别提取所有字母和数字

php - PHP 中的多个正则表达式

python - 使用正则表达式在月份名称之前分割字符串

linux - 如何在一行中使用多个 bash 命令