1

所以我有一个看起来像这样的文件:

DECLARE   
  P_IBSP_YEAR VARCHAR2(32767);  
  P_CD_PROCESSING_YEAR VARCHAR2(32767);  
  P_CD_PROCESSING_MONTH VARCHAR2(32767);  
  ERROR_LEVEL VARCHAR2(32767);  

BEGIN   
  P_IBSP_YEAR := NULL;  
  P_CD_PROCESSING_YEAR := 2013;  
  P_CD_PROCESSING_MONTH := January;  
  ERROR_LEVEL := NULL;  

  T2_GDA.GDA.MAIN_RUN_ALL ( P_IBSP_YEAR, P_CD_PROCESSING_YEAR, P_CD_PROCESSING_MONTH, ERROR_LEVEL );  
  COMMIT;   
END;  

1-我想知道BEGIN之后有多少变量(在这种情况下有四个:P_IBSP_YEAR、P_CD_PROCESSING_YEAR、P_CD_PROCESSING_MONTH、ERROR_LEVEL)
2-我想替换它们的值(出现在“:=”之后) 变量名称的前 20 个字符以百分号为界。

要记住的事情:

a) 我不知道文件中有多少变量(可能有一个或多个)

我想要的输出示例:

DECLARE   
  P_IBSP_YEAR VARCHAR2(32767);  
  P_CD_PROCESSING_YEAR VARCHAR2(32767);  
  P_CD_PROCESSING_MONTH VARCHAR2(32767);  
  ERROR_LEVEL VARCHAR2(32767);  

BEGIN   
  P_IBSP_YEAR := %P_IBSP_YEAR%;  
  P_CD_PROCESSING_YEAR := %P_CD_PROCESSING_YEAR%;  
  P_CD_PROCESSING_MONTH := %P_CD_PROCESSING_MONT%;  
  ERROR_LEVEL := %ERROR_LEVEL%;  

  T2_GDA.GDA.MAIN_RUN_ALL ( P_IBSP_YEAR, P_CD_PROCESSING_YEAR, P_CD_PROCESSING_MONTH, ERROR_LEVEL );  
  COMMIT;   
END;  

[请注意变量 P_CD_PROCESSING_MONTH 变为 %P_CD_PROCESSING_MONT% 因为它超过 20 个字符]

这是我到目前为止所拥有的。它可以工作,但它是非常静态的,因为我每次使用另一个文件时都需要修改我的脚本。因为我对变量名进行了硬编码:

@echo off  

for /f "tokens=* delims=" %%f in ('type %sql_file%') do CALL :DOREPLACE "%%f"  

GOTO AFTER_FOR  
:DOREPLACE  

setlocal enabledelayedexpansion  
SET OUTPUT_1=%*  

set OUTPUT_2=!OUTPUT_1:P_IBSP_YEAR;=%P_IBSP_YEAR%; !  

set OUTPUT_3=!OUTPUT_2:P_CD_PROCESSING_YEAR;=%P_CD_PROCESSING_YEAR%; !  

set OUTPUT_4=!OUTPUT_3:P_CD_PROCESSING_MONTH;=%P_CD_PROCESSING_MONT%; !  

set OUTPUT_5=!OUTPUT_4:ERROR_LEVEL;=%ERROR_LEVEL%; !  

for /f "tokens=* delims=" %%g in ('ECHO %OUTPUT_5%') do ECHO %%~g>>%sql_file%.tmp  

EXIT /b  


:AFTER_FOR  

echo The modified temporary sql script now looks like this  
echo.  
type %sql_file%.tmp  

我想要的看起来更像这样:

我想要一个变量“n”,它基于我在原始文件中的变量数量。此值 n 在每个命令后递增。这样我就不会像我现在那样拥有 1、2、3,...。但总是'n'

SET OUTPUT_1=%*

set OUTPUT_2=!OUTPUT_1:Full_var1_name;=%FIRST_20_CHARACTERS_OF_VAR1%;!

set OUTPUT_3=!OUTPUT_2:Full_var2_name;=%FIRST_20_CHARACTERS_OF_VAR2%; !

set OUTPUT_4=!OUTPUT_3:Full_var3_name;=%FIRST_20_CHARACTERS_OF_VAR3%; !

set OUTPUT_5=!OUTPUT_4:Full_var4_name;=%FIRST_20_CHARACTERS_OF_VAR4%; !

for /f "tokens=* delims=" %%g in ('ECHO %OUTPUT_5%') do ECHO %%~g>>%sql_file%.tmp

EXIT /b  

很抱歉这条长消息。谢谢你:)

4

1 回答 1

0

用 GNU sed搜索和替换

@echo off&setlocal
设置“qfile=file.sql”

设置“tfile=%temp%\%random%.tmp”
(for /f %%i in ('sed -n "/DECLARE/, /BEGIN/ s/\(.*\)\s\w.*/\1/ p" "%qfile%"') 做 (
    设置“行=%%i”
    setlocal enabledelayedexpansion
    设置“线=!线:〜0,20!”
    回声(%%i !line!
    本地端
))>"%t文件%"
for /f "usebackqtokens=1,2" %%i in ("%tfile%") do sed -i "/BEGIN/, $ s/%%i :=.*/%%i := %%%% j%%;/" "%qfile%"
del "%t文件%"
键入“%qfile%”

..输出是:

宣布
  P_IBSP_YEAR VARCHAR2(32767);
  P_CD_PROCESSING_YEAR VARCHAR2(32767);
  P_CD_PROCESSING_MONTH VARCHAR2(32767);
  ERROR_LEVEL VARCHAR2(32767);

开始
  P_IBSP_YEAR := %P_IBSP_YEAR%;
  P_CD_PROCESSING_YEAR := %P_CD_PROCESSING_YEAR%;
  P_CD_PROCESSING_MONTH := %P_CD_PROCESSING_MONT%;
  ERROR_LEVEL := %ERROR_LEVEL%;

  T2_GDA.GDA.MAIN_RUN_ALL (P_IBSP_YEAR, P_CD_PROCESSING_YEAR, P_CD_PROCESSING_MONTH, ERROR_LEVEL);
  犯罪;
结尾;
于 2013-05-27T18:13:49.050 回答