我回答了这个问题,但是我陷入了必须在其中添加单引号的部分。
像原始文件是:
$$BATCHCTRL=TEST-012017
$$STATE=CA AZ
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
新文件应为:
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
我用了
sed -Ei 's/^\$\$STATE=([A-Z]{2}) ([A-Z]{2})/\$\$STATE=\1/g' sed_file
所以我得到了:
$$BATCHCTRL=TEST-012017
$$STATE=CA
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
但现在我无法在其中添加单引号。我尝试转义,使用双引号而不是单引号,尝试不使用引号,但没有一个起作用。
两种选择:
暂时中断作为sed
表达式的单引号字符串,插入"'"
(带引号的单引号字符)并继续。重复其他报价。
$ sed -E 's/^\$\$STATE=([A-Z]{2}) ([A-Z]{2})/$$STATE='"'"'\1'"'"'/' file
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
请注意,$
不必在替换字符串中进行转义。
您也可以\'
代替"'"
:
$ sed -E 's/^\$\$STATE=([A-Z]{2}) ([A-Z]{2})/$$STATE='\''\1'\''/' file
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
或者,
在表达式中使用双引号,并在其中使用单引号作为普通字符。这就要求所有现有的反斜杠和$
字符都必须受外壳保护。
$ sed -E "s/^\\\$\\\$STATE=([A-Z]{2}) ([A-Z]{2})/\$\$STATE='\1'/" file
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
这里需要过多的转义,因为您想在正则表达式中(以及仅在替换部分中)sed
获取原义字符串。在外壳程序的双引号中,只是一个文字。将是一个文字反斜杠,后跟,并且外壳程序将尝试使用后面的内容作为扩展名(或例如)。使用,我们在原义的反斜杠后面加上原义的。\$
$
\$
$
\\$
$
$
$$
$STATE
\\\$
$
我还删除g
了sed
表达式末尾的。由于您将其锚定在行的开头,因此我们不希望替换执行一次以上。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句