@ekaterina_cat

Как оставить только текст внутри нужных полей?

Подскажите пожалуйста как реализовать следующую задачу: Имеется большой файл следюущего содержания
define( 'name', 'Name1' );
random text
define( 'surname', 'Surname1' );
random text
define( 'password', '111111111' );
random text
define( 'api', '123123123123123123' );
random text
random text
define( 'name', 'Name2' );
random text
define( 'surname', 'Surname2' );
random text
define( 'password', '777777777777' );
random text
define( 'api', '90909090909090' );


На выходе нужно получить:

Name1;Surname1;111111111;123123123123123123
Name2;Surname2;777777777777;90909090909090


Как можно решить эту задачу? Спасибо заранее!
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
На перечисленных языках не знаю, я бы такую здачу решал на пхп
preg_match_all("!define\( '(.*?)', '(.*?)' \)!", $data, $m);
foreach ($m[2] as $i => $value) {
    echo $value;
    echo (($i + 1) % 4) ? ";" : "\n";
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
Батник:
@echo off
SetLocal EnableDelayedExpansion

set "filename=1.txt"
set "name=" & set "surname=" & set "pass=" & set "api="
for /f "tokens=2,3 delims=(;', " %%a in ('findstr "define" %filename%') do (
	if /i "%%a" equ "name" (
		set "name=%%b"
	) else if /i "%%a" equ "surname" (
		set "surname=%%b"
	) else if /i "%%a" equ "password" (
		set "pass=%%b"
	) else if /i "%%a" equ "api" (
		set "api=%%b"
	) 
	if defined name if defined surname if defined pass if defined api (
		echo.!name!;!surname!;!password!;!api!
		set "name=" & set "surname=" & set "pass=" & set "api="
	)
)

Предполагается что записи name, surname, password, api будут сгруппированы именно так как в примере, т.е. не будут перемешаны записи разных пользователей.
В таком варианте возможны проблемы, если в файле будут данные, содержащие спец.символы cmd: !%&<>| ...
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
bash. В принципе можно еще уменьшить..
grep -Po "^define.*(name|surname|password|api)[', ]+\K[^']+" FILE.TXT|while read; do
  echo -n "$REPLY";
  count=$(($count+1))
  [ $count -gt 3 ]&&count=0&&echo ""||echo -n ";"
done
echo ""
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы