2017-02-14 10 views
0

を使用してファイル内の文字列の一部を削除し、読書:私は、テキストファイル(test.txtの)中にいくつかのデータを持っているバッチ

wantedunwanteddata 

私はその文字列を出力残りの部分で「不要」の部分を削除したいです(すなわち「wanteddata」別のファイル(test2.txtという名前)で私が使用している:。。なぜならfindstr

findstr /v "unwanted" test.txt>test2.txt 

をしかしそれは空のファイルを返すだ

答えて

2

findstr /v "unwanted" test.txt>test2.txtが動作しません理由は、あなたが与えた条件に一致するを検索します。 findstrは、条件に一致する部分文字列を返すのではなく、条件が満たされている行全体を返します。 findstr /v "unwanted" test.txt>test2.txtでは、のすべての行にtest.txtが含まれていますが、「不要」と表示されない場合はとなります。そのため、test2.txtは空です。そのような行はありません。

バッチでは、変数の値の部分文字列をすべて、次の構文で置き換えることができます。%var:substr=repl%。これにより、文字列%var%に含まれるsubstrのすべての出現がreplに置き換えられます。部分文字列を削除することは、少なくともこの文脈では空の文字列に置き換えることに似ているので、substrのすべての発生を削除するには%var:substr=%を使用できます。

ファイル内の部分文字列をすべて削除する場合は、そのファイルの各行をfor /fという変数で読み取って、その部分文字列を削除した後にその変数を出力することができます。その変数を作成したものと同じfor /f -block内の変数を使用する必要があるため、delayed expansionが必要になります(this answerはその理由を説明しています)。

@echo off 
SetLocal EnableDelayedExpansion 

set input=text1.txt 
set output=text2.txt 
set "substr=unwanted" 

(
    FOR /F "usebackq delims=" %%G IN ("%input%") DO (
     set line=%%G 
     echo. !line:%substr%=! 
    ) 
) > "%output%" 

EndLocal 
exit /b 0 

私は(変数が使用されている場合、引用符が追加される)周囲の引用符なし(パス)にご入力ファイルtext1.txtと変数のあなたOUTPUTFILE text2.txt(それぞれinputoutput)を設定しました。それにより、必要に応じて簡単に変更することができます。
for /fを取り囲む特別な(..)は、出力ファイルへの出力リダイレクトを処理するためのものです。場合
あなたがSetLocal EnableDelayedExpansionEndLocalを省略し、for /f内部call echo %%line:%substr%=%%echo !line:%substr%=!を置き換えることができ、遅延拡張を使用する必要はありません。

EDIT:入力ファイルが<>()|&%などの特殊文字が含まれている場合は、必見使用が拡大を遅らせました。 call echo %%line:%substr%=%%で使用される通常の変数展開では、これらの特殊文字はcmd-interpreter(<および>たとえばinput or output redirection)の特殊な意味で処理され、予期しない結果が生成されます。
また、substr変数の割り当てを囲んだのですが、置換しようとしている部分文字列に<>()|&%のような特殊文字が含まれている場合は、%substr%が期待どおりに機能するようにエスケープする必要があります。 %の代わりに%を二重にする必要があります(%の代わりに%%)、キャレット記号^を使用して特殊文字をエスケープできます。

+0

ありがとう、@ J.Baoby!これは完全に機能します。もう1つの質問 - 私の入力にhtmlタグが含まれていた場合、データデータ(すべて1行で)データビットを削除します。私は上記を試しました。substrを^ データ^に置き換えますが、空のファイルを返しますか? – user3552829

+0

Windows 7マシンで私の側で 'set substr = unwanted'を' set "substr =^ data^ "(可能ならば、' for/f'の中の 'substr'を直接置き換えるのではなく、' substr'を使ってください)特殊文字 '<>'のため、 'substr'変数の代入は、あなたの入力ファイルに特殊文字が含まれていると、遅延拡張を使用する必要があります。私は忘れてしまった細部を覚えています:スクリプトの最後にある 'EndLocal' –

+0

私の投稿に編集を加えました(発言を追加しました)。これがあなたのhtmlタグに役立つことを願っています –

関連する問題