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
(それぞれinput
とoutput
)を設定しました。それにより、必要に応じて簡単に変更することができます。
for /f
を取り囲む特別な(..)
は、出力ファイルへの出力リダイレクトを処理するためのものです。場合
あなたがSetLocal EnableDelayedExpansion
とEndLocal
を省略し、for /f
内部call echo %%line:%substr%=%%
でecho !line:%substr%=!
を置き換えることができ、遅延拡張を使用する必要はありません。
EDIT:入力ファイルが<>()|&%
などの特殊文字が含まれている場合は、必見使用が拡大を遅らせました。 call echo %%line:%substr%=%%
で使用される通常の変数展開では、これらの特殊文字はcmd-interpreter(<
および>
たとえばinput or output redirection)の特殊な意味で処理され、予期しない結果が生成されます。
また、substr
変数の割り当てを囲んだのですが、置換しようとしている部分文字列に<>()|&%
のような特殊文字が含まれている場合は、%substr%
が期待どおりに機能するようにエスケープする必要があります。 %
の代わりに%
を二重にする必要があります(%
の代わりに%%
)、キャレット記号^
を使用して特殊文字をエスケープできます。
ありがとう、@ J.Baoby!これは完全に機能します。もう1つの質問 - 私の入力にhtmlタグが含まれていた場合、データ データ (すべて1行で)データビットを削除します。私は上記を試しました。substrを^ データ^ に置き換えますが、空のファイルを返しますか? –
user3552829
Windows 7マシンで私の側で 'set substr = unwanted'を' set "substr =^ data^ "(可能ならば、' for/f'の中の 'substr'を直接置き換えるのではなく、' substr'を使ってください)特殊文字 '<>'のため、 'substr'変数の代入は、あなたの入力ファイルに特殊文字が含まれていると、遅延拡張を使用する必要があります。私は忘れてしまった細部を覚えています:スクリプトの最後にある 'EndLocal' –
私の投稿に編集を加えました(発言を追加しました)。これがあなたのhtmlタグに役立つことを願っています –