Войти

Показать полную графическую версию : [решено] Удалить в текстовом файле все строки кроме одной нужной.


Страниц : [1] 2 3

9119
16-12-2020, 16:11
Добрый.

Есть однотипные файлы 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 не является штатным средством, однако есть много различных портов под винду.

Vadikan
16-12-2020, 22:15
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

Vadikan
16-12-2020, 23:08
Foreigner, надо же, только сегодня написал в канале про ConvertFrom-Json и тут же не увидел его :)

9119
16-12-2020, 23:09
Удалит всё, за исключением второй строки »
а если скажем нужно удалить 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":" может меняться.

Iska
16-12-2020, 23:21
9119, можно. Только желателен сам файл, целиком, именно в виде файла. Ибо: кодировка, BOM, вид концов строк.

«Привязываться» в json, как и в любом другом структурированном файле, нужно по пути, а не «найти текст-заменить».

Foreigner, надо же, только сегодня написал в канале про ConvertFrom-Json и тут же не увидел его :) »
Vadikan, бывает :).

9119
16-12-2020, 23:31
Прикрепил.

Foreigner
16-12-2020, 23:45
Не совсем понятно зачем удалять строки. Json можно изменить:

$json = Get-Content text.json | ConvertFrom-Json
$json.input.text = "Новый текст"
$json | ConvertTo-Json | Set-Content new.json

9119
17-12-2020, 00:01
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

9119
17-12-2020, 00:26
или вставлять из буфера обмена »
идея хорошая, но бывает что нет возможности скопировать сразу весь текст...
и скажем нажимешь сtrl+с 2-3 раза... тогда такой вариант как я понимаю не подходит...

Как будет выглядить вставка из файла?

p.s. можно и без рисования окошка...
достаточно чтобы скрипт стал на паузу и запросил ввод текста (чтоб можно было текст несколько раз копирнуть в данный сркипт.)

Foreigner
17-12-2020, 00:34
Как будет выглядить вставка из файла? »


$text = Get-Content file.txt
$json.input.text = $text

Iska
17-12-2020, 00:39
Foreigner, можно совместить оба подхода — подставлять в тамошний InputBox default'ом значение из Буфера обмена. Тут тебе и возжожность визуального контроля, и возможность ручной коррекции — невеликая плата за лишнее нажатие Enter.

9119
17-12-2020, 00:43
можно совместить оба подхода »
как это выглядит в powershell?

Vadikan
17-12-2020, 00:53
Мне кажется надо просто параметр к скрипту добавить. Зачем останавливать скрипт и ждать ввода, указывайте сразу.

Выглядит как-то так http://forum.oszone.net/post-2942327.html#post2942327

9119
17-12-2020, 00:59
Зачем останавливать скрипт и ждать ввод »
в этом вся суть.... нужно разный текст постоянно менять, каждый раз менять в скрипте - не вариант, как впринципе и в отдельном файле (лишние движения в ввиде ctrl-v, ctrl-s ).
Тут как раз надо чтоб копировать из буфера, с возможностью корректировки на лету так сказать, не лазя по доп файлам...

Iska
17-12-2020, 01:08
как это выглядит в 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).

9119
17-12-2020, 01:13
Если без особых изысков »
как это совместить с вариантом предложенным на предыдущей странице?
$json = Get-Content text.json | ConvertFrom-Json
$json.input.text = "Новый текст"
$json | ConvertTo-Json | Set-Content new.json

Iska
17-12-2020, 01:18
Не проверялось:
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