您可以使用sub(第一个匹配子字符串,sed“s///”)或gsub(全局替换匹配子字符串,sed“s///g”)命令替换使用awk 的正则表达式模式.正则表达式本身在sed 和awk 之间没有区别。在你的情况下,你想要:
解决方案 1
编辑:编辑以匹配 cmets
以下awk 将限制替换为给定的子字符串(例如'POSA_____POSB'):
echo "OOPS POSA_____POSB" | awk '{str="POSA_____POSB"}; {gsub(/[POSAB]/,"&@",str)}; {gsub(/'POSA_____POSB'/, str); print $0} '
如果你的输入只包含匹配的字符串,试试这个:
echo "POSA_____POSB" | awk '{gsub(/[POSAB]/,"&@");}1'
解释:
为了清楚起见,为每个操作单独的“{}”和明确的print。
gsub 接受 3 个参数 gsub(pattern, substitution [, target]),其中目标必须是可变的(gsub 将在原地更改它并将结果存储在那里)。
在进行任何替换之前,我们使用名为 'str' 的 var 并使用值(您的字符串)对其进行初始化。
第二个gsub 用于将修改后的str 放入$0(匹配整个记录/行)。
默认情况下,表达式为greedy --- 它们将匹配可能的最长字符串。
[] 引入要匹配的字符集:任何字符的每次出现都会被匹配。上面的表达式表示awk 匹配任何“POSAB”的出现。
您的第一个正则表达式没有按预期工作,因为您告诉sed 匹配以[AB] 中的任何一个结尾的POS(一次整个字符串)。
在另一个表达式中,您告诉它在使用时匹配任何单个字符(包括“_”):'.'(点)。
如果您想概括此解决方案,您可以使用:[\w] 表达式将匹配 [a-zA-Z0-9_] 或 [a-z]、[A-Z]、[0-9] 中的任何一个,以分别匹配小写、大写字母和数字。
解决方案 2
请注意,您可以使用 [^] 否定字符集,因此:[^_] 在这种特殊情况下也可以使用。
解释:
否定的意思是:匹配除了'[]'之间的字符之外的任何东西。 '^' 字符必须作为第一个字符出现,就在打开 '[' 之后。
旁注:
另外,最好使用[POSAB]? 或[POSAB]{1} 直接表明您希望一次匹配一个字符。
另请注意,sed 的某些实现可能需要-r 开关才能使用扩展(更复杂)的正则表达式。