将字符串替换为sed或awk,其中它标识一种模式,如下所述
请告知我如何使用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}
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
与GNUawk类似
$ 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)上完成这项工作。