2017-02-14 21 views
0

У меня есть некоторые данные в виде текстового файла (test.txt), чтение:Удалить часть строки в файл с помощью партии

wantedunwanteddata 

Я хочу, чтобы удалить «ненужные» части в этой строке и вывести остальное . (т.е. «wanteddata» в другом файле (test2.txt) Я использую:.

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

, однако, что это возвращение пустой файл

ответ

2

причина findstr /v "unwanted" test.txt>test2.txt не будет работать, потому что findstr ищет строк в соответствии с условиями, которые вы ему предоставили. findstr не будет возвращать подстроки, соответствующие условиям, но всю строку, где выполняются условия. В findstr /v "unwanted" test.txt>test2.txt вы просите все строки в test.txt без «нежелательных» в нем. Вот почему test2.txt пуст: таких строк нет.

В пакетном режиме вы можете заменить все вхождения подстроки на значение переменной следующим синтаксисом: %var:substr=repl%. Это заменит все вхождения substrrepl в строке %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% работал должным образом. Вы можете избежать специального символа с значком каретки ^, за исключением %, который должен быть удвоен (%% вместо %).

+0

Спасибо, @ J.Baoby! Это прекрасно работает. Еще один вопрос: что, если я вхожу в мои теги html, так вот: данные данные (все в одной строке), и я хотел удалить данные бит. Я попробовал выше (заменив substr на^ данные^, но возвращает пустой файл? – user3552829

+0

он работал на моей стороне на машине Windows 7, заменив 'set substr = unwanted' на' set 'substr =^ данных^ "' (если возможно, продолжайте использовать переменную 'substr' вместо прямой замены' substr' внутри 'for/f'. Из-за специальных символов' <> 'присвоение переменной' substr' должно быть окруженными двойными кавычками. Кроме того, если ваш входной файл содержит специальные символы, вы будете обязаны использовать задержанное расширение. Вы помогли мне вспомнить небольшую деталь, которую я забыл: «EndLocal» в конце скрипта (даже хотя это упущение не должно быть проблемой). –

+0

Я сделал редактирование своего сообщения (добавлено замечание). Надеюсь, это поможет вашим html-тегам –