Показать полную графическую версию : [решено] Удалить в текстовом файле все строки кроме одной нужной.
Добрый.
Есть однотипные файлы txt. В них строка №2. Очень длинная. Явно превышающая стандартное ограничение.
find и findstr пишут "длинная строка"
txt во вложении.
Начинается нужная строка всегда с "audioContent".
Нужно:
1) скопировать строку №2 из source.txt в out.txt.
или
в source.txt удалить ВСЕ строки кроме №2.
В идеале, нужно решение без привязки к искомым словам, а просто к номеру строк.
2) В результирующем txt удалить пробелы, слово "audioContent" и (")двойные кавычки(")
greg zakharov
16-12-2020, 18:46
Берём в руки sed, и:
sed -i.bak "2!d" *.txt
Удалит всё, за исключением второй строки в txt файлах текущего каталога (с созданием резервных копий оригиналов).
sed не является штатным средством, однако есть много различных портов под винду.
Powershell
$c = Get-Content -Path "C:\temp\source.txt"
($c[1].split(':')[1].split('"').split(',')).trim() -ne "" | Out-File C:\temp\out.txt
Foreigner
16-12-2020, 23:03
Конкретно для этого файла.
(Get-Content .\source.txt | ConvertFrom-Json).audioContent | Set-Content out.txt
Foreigner, надо же, только сегодня написал в канале про ConvertFrom-Json и тут же не увидел его :)
Удалит всё, за исключением второй строки »
а если скажем нужно удалить 2 и 3 строки... как тогда будет выглядеть команда для sed?
Powershell »
есть также файл text.json вида:
{
"audioConfig": {
"audioEncoding": "LINEAR16",
"pitch": 0,
"speakingRate": 1
},
"input": {
"text": "Тест речевого движка"
},
"voice": {
"languageCode": "ru-RU",
"name": "ru-RU-Wavenet-B"
}
}
Можно ли реализовать замену Тест речевого движка на любую другую фразу (длинную и с символами) в этом файле посредством cmd/powershell/стороннего софта?
В идеале, чтобы после ввода нового текста (до того как он заменит собой Тест речевого движка) он как бы становился в одну строку...без пробелов между строками, абзацев и тд. (как если вы, например, скопируете содержимое любой +/- интернет-статьи и вставите скажем в адресную строку браузера хром, а потом скопируете от туда..там автоматом весь текст делается в 1 строку.)
Привязаться можно разве что к "text": , т.к другие параметры могут быть измененены/смещены и т.д. (в т.ч и Тест речевого движка)
Удалить, например в text.json нужную строку по номеру (как с sed) и вместо нее вставить нужную - не выйдет, т.к номер строки с ""text":" может меняться.
9119, можно. Только желателен сам файл, целиком, именно в виде файла. Ибо: кодировка, BOM, вид концов строк.
«Привязываться» в json, как и в любом другом структурированном файле, нужно по пути, а не «найти текст-заменить».
Foreigner, надо же, только сегодня написал в канале про ConvertFrom-Json и тут же не увидел его :) »
Vadikan, бывает :).
Foreigner
16-12-2020, 23:45
Не совсем понятно зачем удалять строки. Json можно изменить:
$json = Get-Content text.json | ConvertFrom-Json
$json.input.text = "Новый текст"
$json | ConvertTo-Json | Set-Content new.json
Json можно изменить »
я этого не знал. Это правда проще.
Я так понял это powershell.
Тогда, если можно, немного уточну задачу..
1) $json = Get-Content text.json | ConvertFrom-Json
2) здесь нужно вывести окно с запросом о вводе текста (при вводе текста задается значение переменной). Не обязательно отдельным окном, но желательно.
Скрипт при этом останавливается, пока не введем нужный текст.
3) $json.input.text = "переменная"
4) $json | ConvertTo-Json | Set-Content new.json
Простите что так на пальцах...
Foreigner
17-12-2020, 00:11
2) здесь нужно вывести окно с запросом о вводе текста и задать переменную »
Рисовать окошко? Может как-то попроще, например брать текст из файла или вставлять из буфера обмена? Например:
$json.input.text = Get-Clipboard
Т.е. скопировал нужный текст в буфер и запустил скрипт.
PS. Если несколько строк, и это не поддерживается речевым движком, то можно их сконвертировать в одну строку:
$json.input.text = Get-Clipboard | Out-String
или вставлять из буфера обмена »
идея хорошая, но бывает что нет возможности скопировать сразу весь текст...
и скажем нажимешь сtrl+с 2-3 раза... тогда такой вариант как я понимаю не подходит...
Как будет выглядить вставка из файла?
p.s. можно и без рисования окошка...
достаточно чтобы скрипт стал на паузу и запросил ввод текста (чтоб можно было текст несколько раз копирнуть в данный сркипт.)
Foreigner
17-12-2020, 00:34
Как будет выглядить вставка из файла? »
$text = Get-Content file.txt
$json.input.text = $text
Foreigner, можно совместить оба подхода — подставлять в тамошний InputBox default'ом значение из Буфера обмена. Тут тебе и возжожность визуального контроля, и возможность ручной коррекции — невеликая плата за лишнее нажатие Enter.
можно совместить оба подхода »
как это выглядит в powershell?
Мне кажется надо просто параметр к скрипту добавить. Зачем останавливать скрипт и ждать ввода, указывайте сразу.
Выглядит как-то так http://forum.oszone.net/post-2942327.html#post2942327
Зачем останавливать скрипт и ждать ввод »
в этом вся суть.... нужно разный текст постоянно менять, каждый раз менять в скрипте - не вариант, как впринципе и в отдельном файле (лишние движения в ввиде ctrl-v, ctrl-s ).
Тут как раз надо чтоб копировать из буфера, с возможностью корректировки на лету так сказать, не лазя по доп файлам...
как это выглядит в powershell? »
Если без особых изысков, то наподобие:
Add-Type -AssemblyName 'Microsoft.VisualBasic'
$sValue = [Microsoft.VisualBasic.Interaction]::InputBox('Enter value:', 'Enter value', (Get-Clipboard -Format Text))
$sValue
Это уже, конечно, не совсем чистый PoSH. А так-то можно хоть цельный диалог нарисовать, с подкидным дураком и блудницами: Создание настраиваемого поля ввода - PowerShell | Microsoft Docs (https://docs.microsoft.com/ru-ru/powershell/scripting/samples/creating-a-custom-input-box?view=powershell-7.1).
Если без особых изысков »
как это совместить с вариантом предложенным на предыдущей странице?
$json = Get-Content text.json | ConvertFrom-Json
$json.input.text = "Новый текст"
$json | ConvertTo-Json | Set-Content new.json
Не проверялось:
Add-Type -AssemblyName 'Microsoft.VisualBasic'
$json = Get-Content text.json | ConvertFrom-Json
$json.input.text = [Microsoft.VisualBasic.Interaction]::InputBox('Enter value for node [json.input.text]:', 'Enter value', (Get-Clipboard -Format Text))
$json | ConvertTo-Json | Set-Content new.json
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.