有关我正在工作的环境的信息:
$ 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-周期389210的移动存在)并使用波浪号,但是第二个代码块只是将波浪号替换为字符n。我也看到在this(sed's / [〜] /)之后的第一个代码块中必须有换行符,这就是为什么我虽然拥有\ n会模拟换行符,但事实并非如此。我认为我不同的输出结果是因为正则表达式的使用方式。我试图研究正则表达式,并在stackoverflow上对其进行搜索,但是没有获得我想要的东西。有人可以解释一下我如何从代码块B中获得与代码块A相同的结果,而不必将我的部分代码放在第二行吗?
先感谢您
最佳答案
Etan Reisner's helpful answer解释了该问题,并基于ANSI C-quoted string($'...'
)提供了单行解决方案,考虑到您最初标记了bash的问题,这是适当的。
(Ed Morton's helpful answer向您展示了如何使用更简单,更有效的另一种方法完全绕开您的问题。)
但是,听起来您的外壳实际上有所不同-大概是ksh88
,它是Korn Shell的旧版本,是AIX 6.1上的默认sh
-不支持此类字符串[1]
(ANSI C引用的字符串是在ksh93
中引入的,不仅在bash
中受支持,而且在zsh
中也受支持)。
因此,您具有以下选项:
\
-转义的)实际换行符,如代码块A所示。$(printf '\n')
不起作用,因为命令替换总是会修剪所有尾随的换行符,在这种情况下会导致字符串为空。 ksh93
可以作为/usr/bin/ksh93
在AIX 6.1上用作替代shell。 sed
,它本地理解替换字符串中的转义序列,例如\n
。 [1]至于在不支持
echo 'foo~bar~baz' | sed $'s/[~]/\\\n/g'
的类似POSIX的外壳中尝试$'...'
时实际发生的情况:$
保持原样,因为后面的内容不是有效的变量名,并且sed
最终看到了文字$s/[~]/\\\n/g
,其中$
解释为应用于最后一条输入行的上下文地址-在这里没有区别,因为只有1行。 \\
解释为纯\
,\n
解释为纯n
,有效地用文字~
序列替换了\n
实例。关于regex - 下面的两个sed命令有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36227417/