输入字符串:PARAM
一段不起作用的代码。
PARAM="0 " 0 - Exit" off 1 " 1 - RUN_INITIAL_TASK" off 2 " 2 - (N.I.U) FORBID REF LEAP SERVICE" off 3 " 3 - INSTALL MY REF LEAP SERVICE" off 4 " 4 - INSTALL SUDOERS" off 5 " 5 - INSTALL SET LOCALE" off 6 " 6 - REMOVE PACKAGE and SET LOCK" off 7 " 7 - INSTALL MY MINI SYS CONFIG" off 8 " 8 - INSTALL JOURNALD CONFIG" off 9 " 9 - INSTALL PAM.D CONFIG" off 10 " 10 - INSTALL MY BASH FUNCTIONS" off 11 " 11 - INSTALL KERNEL HEADERS and COMPILING TOOLS" off 12 " 12 - INSTALL SSH" off 13 " 13 - INSTALL PUTTY" off 14 " 14 - INSTALL BROTHER PRINTER" off 15 " 15 - INSTALL HPLIP PRINTER" off 16 " 16 - CONFIGURE FIREWALLD" off 17 " 17 - INSTALL VIRTUALBOX HOST MODE 1" off 18 " 18 - INSTALL VIRTUALBOX HOST MODE 2" off 19 " 19 - INSTALL VIRTUALBOX VM GUEST" off"
CUR_PARAM=${PARAM}
NEW_PARAM=$(echo ${CUR_PARAM} | sed -e '/3/ s/off/on/')
得到了:
" 0 - Exit" on 1 " 1 - ..............
预期结果:
0 " 0 - Exit" off 1 " 1 - RUN_INITIAL_TASK" off 2 " 2 - (N.I.U) FORBID REF LEAP SERVICE" off 3 " 3 - INSTALL MY REF LEAP SERVICE" **on** 4 " 4 - INSTALL SUDOERS" off 5 " 5 - INSTALL SET LOCALE" off 6 " 6 - REMOVE PACKAGE and SET LOCK" off 7 " 7 - INSTALL MY MINI SYS CONFIG" off 8 " 8 - INSTALL JOURNALD CONFIG" off 9 " 9 - INSTALL PAM.D CONFIG" off 10 " 10 - INSTALL MY BASH FUNCTIONS" off 11 " 11 - INSTALL KERNEL HEADERS and COMPILING TOOLS" off 12 " 12 - INSTALL SSH" off 13 " 13 - INSTALL PUTTY" off 14 " 14 - INSTALL BROTHER PRINTER" off 15 " 15 - INSTALL HPLIP PRINTER" off 16 " 16 - CONFIGURE FIREWALLD" off 17 " 17 - INSTALL VIRTUALBOX HOST MODE 1" off 18 " 18 - INSTALL VIRTUALBOX HOST MODE 2" off 19 " 19 - INSTALL VIRTUALBOX VM GUEST" off
欢迎任何帮助。
很难猜出你想问什么,但根据标题,我猜
sed 's/\(3.*\)off/\1on/'
一个复杂的问题是
.*
匹配最长的可能字符串。根据您的数据,也许像 [^-]*
这样的内容更有意义,只要字符不是破折号,它就会匹配。
括号内的字符串被捕获到
\1
中,然后我们在替换中使用捕获的字符串,基本上,将匹配项替换为自身,只有紧随其后的字符串从 off
更改为 on
。
您可能还想在
3
周围添加单词边界锚点,但具体效果取决于您使用的是哪种 sed
方言。常见的替代方案包括 \<3\>
、\b3\b
和 [[:<:]]3[[:>:]]
您的尝试
/3/ s/off/on/'
只是说,在与 off
匹配的任何行上将第一次出现的 on
替换为 /3/
。
另外,引用您的变量,除非您特别希望 shell 对值执行空格标记化和通配符扩展,并且 不要对私有变量使用大写字母。