2017-10-20 7 views
0

以下のバッチスクリプトは、これまでうまく動作するテキストファイルを再フォーマットするためのスクリプトです。文字列に応じて特定の行に最後の単語の前に文字列NODATAを挿入する方法は?

この文脈では、任意の単語文字またはドットまたはハイフンで構成される文字列は、の単語と解釈されます。

文字列が単語を最後に残された場合、最後のが、1つの単語としてNODATAを挿入するための要件は、それぞれ比較した大文字と小文字を区別しないで検索する必要があり、次の文字列のどれもありません:

  • API
  • Server Module
  • Version

入力データ例:

Check Masterdata API 3.1.8 
Core Server Module 3.1.8-P02 
Check Subsystem version 3.1.8-11P 
Core resources 1.2.1 

予想される出力データ:

Check Masterdata API 3.1.8 
Core Server Module 3.1.8-P02 
Check Subsystem version 3.1.8-11P 
Core resources NODATA 1.2.1 

私は正規表現であるため、純粋な知識のコードは、この要件のためのバッチファイルに追加する任意のアイデアを持っていません。私はそれがjrepl.batでもできると思います。

適切なjrepl.batコマンドラインをこのバッチファイルの既存の呼び出しの上に追加して、正しい行に右の位置にNODATAを挿入することをおすすめしますか?

スクリプト:あなたがして助けを必要とするコードのセクションで

call "%~dp0jrepl.bat" "[^\w.\-]+([\w.\-]+)[^\w.\-]+([\w.\-]+)$" ",$1,$2" /F "%tempFile2%" /O "%tempFile3%" 
+1

「私は必要です」は質問ではありませんので、[ツアー]を読んで[尋ねてください]! – aschipfl

+0

あなたはすべての入力行に3つの単語とバージョンコードが必要だと言っていますか? 3つの単語がない場合は、3番目の単語としてNODATAという単語を追加しますか? – Squashman

+0

@Squashman、いいえ、最後の単語の前の単語がAPI(または)Serverモジュール(または)バージョンでない場合、最後の単語の前にNODATAを追加する必要があります。 – Deepti

答えて

0

私はすでにjrepl.batを呼び出す行の上に次の2行を追加することをお勧めします。 NODATAを挿入で

call "%~dp0jrepl.bat" "\b([\w.\-]+)$" "NODATA $1" /F "%tempFile2%" /O - 
call "%~dp0jrepl.bat" "(API|Server Module|Version)[\t ]+NODATA" "$1" /I /F "%tempFile2%" /O - 

最初の行の結果は、一時ファイル2のすべての行に単語を最後に残しました。

2行目には、1つの以上のタブまたはスペースと直前挿入NODATA続いマーキング/キャプチャグループにAPI又はServer Module又はVersionため、大文字と小文字を区別しない検索します。置換えによってタブ/スペースが削除され、APIまたはServer ModuleまたはVersionのように表示されます。

+0

ありがとう、その作業 – Deepti

0

、私はあなたがいなかったとtemp.txtで不要な末尾のスペースをエコー防止これらの地域では遅れ拡大、二重引用符とインデントを使用していました。

rem Not Working Starts 

for /f "delims=" %%j in (%tempFile2%) do (
    set "Fileline=%%j" 
    set "Fileline_API=!Fileline:API=!" 
    set "Fileline_Client=!Fileline:Client=!" 
    set "Fileline_ServerModule=!Fileline:Server module=!" 
    set "Fileline_Component=!Fileline:Component=!" 
    set "Fileline_GlobalsModule=!Fileline:Globals module=!" 
    set "Fileline_ClientBaseModule=!Fileline:Client base module=!" 
    set "Fileline_GlobalBaseModule=!Fileline:Global base module=!" 
    set "Fileline_ServerBaseModule=!Fileline:Server base module=!" 
    set "Fileline_Global=!Fileline:Global=!" 

    if "!Fileline!"=="!Fileline_API!" (
     if "!Fileline!"=="!Fileline_Client!" (
      if "!Fileline!"=="!Fileline_ServerModule!" (
       if "!Fileline!"=="!Fileline_Component!" (
        if "!Fileline!"=="!Fileline_GlobalsModule!" (
         if "!Fileline!"=="!Fileline_ClientBaseModule!" (
          if "!Fileline!"=="!Fileline_GlobalBaseModule!" (
           if "!Fileline!"=="!Fileline_ServerBaseModule!" (
            if "!Fileline!"=="!Fileline_Global!" (
             >temp.txt echo !Fileline! 

             rem Section to get the last word but one and do if else conditions 

            ) 
           ) 
          ) 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
) 

rem Not Working Ends 

あなたはもちろん、さらにまだそれを短縮することができ、スクリプトの別の場所で変数の多くを必要としていないようです。

rem Not Working Starts 

for /f "delims=" %%j in (%tempFile2%) do (
    set "Fileline=%%j" 
    if "%%j"=="!Fileline:API=!" (
     if "%%j"=="!Fileline:Client=!" (
      if "%%j"=="!Fileline:Server module=!" (
       if "%%j"=="!Fileline:Component=!" (
        if "%%j"=="!Fileline:Globals module=!" (
         if "%%j"=="!Fileline:Client base module=!" (
          if "%%j"=="!Fileline:Global base module=!" (
           if "%%j"=="Fileline:Server base module=!" (
            if "%%j"=="!Fileline:Global=!" (
             >temp.txt echo %%j 

             rem Section to get the last word but one and do if else conditions 

            ) 
           ) 
          ) 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
) 

rem Not Working Ends 

あなたのロジックなどで存在しうるすべての問題は、これらの答えの範囲外があります。

0

希望の出力目標を誤解していないことを願っています。

の入力があります。

Check Masterdata API 3.1.8 
Core Server Module 3.1.8-P02 
Check Subsystem version 3.1.8-11P 
Core resources 1.2.1 

あなたはこのコードを使用することができます:

@echo off 
setlocal enabledelayedexpansion 

FOR /F "delims=" %%G IN (input.txt) DO (
     SET "line=%%G" 
     SET "line=!line:api=!" 
     SET "line=!line:server module=!" 
     SET "line=!line:version=!" 
     IF "%%G"=="!line!" (
      CALL :NODATA "%%G" 
     ) ELSE (
      echo %%G 
     ) 
) 
pause 
GOTO :EOF 

:NODATA 
set i=0 
set "x=%~1" 
set "xb=%x: =" & set "xl=%" 
set "newline=!x:%xl%=NODATA %xl%!" 
echo %newline% 
goto :EOF 

をそして、これは私がそれから得る出力されます。

Check Masterdata API 3.1.8 
Core Server Module 3.1.8-P02 
Check Subsystem version 3.1.8-11P 
Core resources NODATA 1.2.1 

あなたの元の質問には非常に多くのコードがありますが、あなたのコードでこれが必要な場所は本当にわかりません。私はあなたの入力と出力の例に基づいてコーディングしました。

+0

ありがとう、その作業 – Deepti

関連する問題