Вот окончательное решение PowerShell, которое будет работать с новыми линиями. Предполагается, что разделитель является хэштегом, за которым следуют символы слова, за которыми следует . При наличии строки данных без хэш-тега предполагается, что данные продолжаются до следующей строки. Другая информация под этим разделом моего ответа не касается особого случая, упомянутого автором, когда данные пересекают границу новой строки. В этом примере предполагается, что файл называется test.txt и находится в текущем каталоге.
[string[]]$fileContent = (get-content .\test.txt); [string]$linebuffer = ''; [object]$fixedFile = foreach($line in $fileContent) { if(-not ($line -match "#\w+$")) { $linebuffer += ($line + ' '); continue; } $linebuffer += $line; $linebuffer; $linebuffer = ''; } ($fixedFile -replace '^(.*)\ (#.*)$', '$2 $1' | Sort-Object) -replace '^(#\w+)\ (.*)$','$2 $1' | out-file test.txt -encoding ascii
Используйте gVim в Windows или MacVim в OS X.
ПРИМЕЧАНИЕ: Vim - это редактор с 2 режимами. Режим вставки / редактирования и командный режим. Чтобы на самом деле редактировать текст как обычный редактор, вы должны находиться в режиме редактирования, который требует нажатия клавиши, например a
или i
. Редактор запустится в командном режиме. В командном режиме вы можете просто начать с ввода двоеточия для ввода этих команд.
:%s/^\(.*\)\ \(\#\w\+\)$/\2\ \1/g :sort :%s/^\(\#\w\+\)\ \(.*\)$/\2\ \1/g
Первая команда заменяет хэштегом в конце строки на начало строки. Вторая команда сортирует данные, а третья команда отменяет своп и перемещает хештег обратно в конец строки.
Я проверил это на вашем образце, и это работает.
@Oliver_Salzburg предоставил намного более простой ответ с помощью Excel в комментариях. Я не думал нестандартно и предоставил ответ с помощью текстового редактора.
Шаг 1. Замените
#
на,#
Шаг 2. Импортируйте как CSV в Excel или аналогичное приложение. - Оливер Зальцбург ♦
Вот решение, использующее только Powershell, которое можно сделать изначально на Win7. У меня до сих пор не было возможности прочитать про разрывы строк, поэтому это решение не учитывает их.
В этом примере предполагается, что файл, с которым вы работаете, является test.txt
.
$tempstor = (get-content test.txt) -replace '^(.*)\ (#.*)$', '$2 $1' | Sort-Object $tempstor -replace '^(#\w+)\ (.*)$','$2 $1' | out-file test.txt -encoding ASCII
Один вкладыш, рычаги суб-снарядов.
((get-content test.txt) -replace '^(.*)\ (#\w+)$', '$2 $1' | Sort-Object) -replace '^(#\w+)\ (.*)$','$2 $1' | out-file test.txt -encoding ascii