我回答了这个问题,但我被困在我必须添加单引号的部分。
像原始文件是:
$$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
获取文字字符串(并且只是在替换部分中)。在 shell 的双引号内,只是一个文字. 将是一个文字反斜杠,后跟,并且 shell 会尝试使用之后的任何内容作为扩展(或例如)。使用,我们给出一个文字反斜杠,后跟一个文字。\$
$
\$
$
\\$
$
$
$$
$STATE
\\\$
$
我还删除了表达式
g
末尾的。sed
由于您将其锚定在行首,我们预计替换不会超过一次。bash
FWIW,您可以使用以下命令替换命令行sed
调用中的单引号中的 plus slip,如图所示:这样,您就可以避免“过度反斜杠”,已知会导致“反斜杠炎”。
需要思考的几点:
当在 s/// 命令的 lhs 上使用除最后一个以外的任何位置时,将
$
失去其元字符状态。Ofc,你必须在单引号中,否则 bash 将启动并扩展 vars。我在谈论 sed 的作用。在 s/// 命令的 rhs 中,$ 不是元字符,因此无需对其进行转义。
Sed 将处于 -e 模式而不是 -re 模式。
高温高压
我尝试过以下方法
输出