причина findstr /v "unwanted" test.txt>test2.txt
не будет работать, потому что findstr
ищет строк в соответствии с условиями, которые вы ему предоставили. findstr
не будет возвращать подстроки, соответствующие условиям, но всю строку, где выполняются условия. В findstr /v "unwanted" test.txt>test2.txt
вы просите все строки в test.txt
без «нежелательных» в нем. Вот почему test2.txt
пуст: таких строк нет.
В пакетном режиме вы можете заменить все вхождения подстроки на значение переменной следующим синтаксисом: %var:substr=repl%
. Это заменит все вхождения substr
repl
в строке %var%
. Поскольку удаление подстроки похоже на замену пустой строкой (по крайней мере в этом контексте), вы можете использовать %var:substr=%
для удаления всех вхождений 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
и заменить echo !line:%substr%=!
на call echo %%line:%substr%=%%
внутри for /f
.
EDIT: Если входной файл содержит специальные символы, такие как <>()|&%
, вы необходимо использования задержку расширения. При нормальном переменном расширении, используемом в call echo %%line:%substr%=%%
, эти специальные символы будут обрабатываться специальными значениями cmd-интерпретатором (например, <
и >
для input or output redirection) и создавать неожиданные результаты.
Также я окружил назначение переменной substr
, но если подстрока, которую вы пытаетесь заменить, содержит специальные символы, такие как <>()|&%
, каждый из них также должен быть экранирован для того, чтобы %substr%
работал должным образом. Вы можете избежать специального символа с значком каретки ^
, за исключением %
, который должен быть удвоен (%%
вместо %
).
Спасибо, @ J.Baoby! Это прекрасно работает. Еще один вопрос: что, если я вхожу в мои теги html, так вот: данные данные (все в одной строке), и я хотел удалить данные бит. Я попробовал выше (заменив substr на^ данные^ , но возвращает пустой файл? –
user3552829
он работал на моей стороне на машине Windows 7, заменив 'set substr = unwanted' на' set 'substr =^ данных^ "' (если возможно, продолжайте использовать переменную 'substr' вместо прямой замены' substr' внутри 'for/f'. Из-за специальных символов' <> 'присвоение переменной' substr' должно быть окруженными двойными кавычками. Кроме того, если ваш входной файл содержит специальные символы, вы будете обязаны использовать задержанное расширение. Вы помогли мне вспомнить небольшую деталь, которую я забыл: «EndLocal» в конце скрипта (даже хотя это упущение не должно быть проблемой). –
Я сделал редактирование своего сообщения (добавлено замечание). Надеюсь, это поможет вашим html-тегам –