将字符串替换为sed或awk,其中它标识一种模式,如下所述

将字符串替换为sed或awk,其中它标识一种模式,如下所述,awk,sed,Awk,Sed,请告知我如何使用AWK将以下输入转换为上述输出: 输入 CREATE TABLE ${hf:XX_DB_XX}.test_${hf:XX_YYYYMMDD_XX} AS SELECT id FROM ${hf:XX_R_DB_XX}.usr_${hf:XX_YYYYMMDD_XX} WHERE year = ${hf:XX_YYYY_XX} AND month = ${hf:XX_MM_XX} AND day = ${hf:XX_DD_XX}

请告知我如何使用AWK将以下输入转换为上述输出:

输入

CREATE TABLE ${hf:XX_DB_XX}.test_${hf:XX_YYYYMMDD_XX}
AS
SELECT id
FROM ${hf:XX_R_DB_XX}.usr_${hf:XX_YYYYMMDD_XX}
WHERE year              = ${hf:XX_YYYY_XX}
AND month       = ${hf:XX_MM_XX}
AND day         = ${hf:XX_DD_XX};
输出

CREATE TABLE XX_DB_XX.test_XX_YYYYMMDD_XX
AS
SELECT id
FROM XX_R_DB_XX.usr_XX_YYYYMMDD_XX
WHERE year              = XX_YYYY_XX
AND month       = XX_MM_XX
AND day         = XX_DD_XX;
下面是我用来将给定输出转换为输入的内容

awk '{gsub(/XX_[a-zA-Z]+_XX/,"${hf:&}")} 1' <filename>
awk'{gsub(/XX[a-zA-Z]+\uxx/,“${hf:&}”)}1'
为了扭转这种局面,我尝试了下面的方法,但没有成功

awk '{gsub(/${hf:XX_[a-zA-Z]+_XX}/,"&")} 1' <filename>
awk'{gsub(/${hf:XX_u[a-zA-Z]+XX}/,“&”)}1'

sed
在这里就可以了

$ sed -E 's/\$\{hf:([^}]+)\}/\1/g' file
与GNU
awk类似

$ awk '{print gensub(/\${hf:([^}]+)}/,"\\1","g")}' file

@kvantour我刚刚添加了我尝试过的规格,只是没有提到相同的。谢谢,这很有效。有没有办法在awk中做到这一点,我发现很难理解sed的语法。正则表达式没有区别,使用
awk
您需要键入更多字符!我认为在使用ERE:
sed-E的/\${hf:([^}]+)}/\1/g'
@SLePort时不需要转义
\{
,如果您想像karakfas脚本那样被视为文字字符。给定未跳过的{和},awk可以判断您何时尝试使用re间隔,但sed假设{…}总是打算用作re间隔,因此如果未跳过的{和}之间的文本不是数字,则会失败并出现错误。@EdMorton您对文本
\{
的看法绝对正确(我在评论时没有完全清醒过来)但奇怪的是,在ERE模式下使用
{
(不转义)可以在BSDSED(Mac OS)上完成这项工作。