2016-11-08 5 views
1

я получил массив, который имеет значение (новую строку после каждого «текст»)Powershell: соединить две строки в массиве

[email protected]" 
     "first","line","of","text" 
     "second","line","of","text 
     third","line","of","text" 
     "fourth","line","of","text" 
     "@ 

Я пытаюсь написать код Powershell, который ищет строки, которые начинаются с «но не заканчивается». Если он соответствует условию, следующая строка присоединяется к согласованной строке с разделителем запятой. Пример: вторая строка соответствует условию, поэтому третья строка соединяется со второй строкой с запятой между ними. как указано ниже

"first","line","of","text" 
"second","line","of","text,third","line","of","text" 
"fourth","line","of","text" 

До сих пор у меня это со мной. Но он добавляет только к EOL, но не присоединяется к нему. Пожалуйста, дайте мне знать, что я упускаю

[email protected]() 
foreach ($item in $result){ 
if ($item -notlike '*"') 
{ $result+=$item+"," } 
else 
{ $result+=$item} 
} 
+1

Hm, это может быть х-у проблемы. Можете ли вы объяснить, почему вы хотите это сделать? –

+0

Я пытаюсь найти строки поиска, которые не заканчиваются на «. Если это соответствует случаю, тогда мне нужно присоединиться к строке с следующей строкой (с запятой между ними), чтобы сделать ее одной строкой. И этот результат переменной имеет несколько линии, которые не заканчиваются на « Я выделил желаемый результат во втором разделе кода. – clicks010

ответ

3

я получил массив, который имеет значение (новую строку после каждого «текст»)

[email protected]" 
     "first","line","of","text" 
     "second","line","of","text 
     third","line","of","text" 
     "fourth","line","of","text" 
"@ 

* (ошибка синтаксиса фиксированного)

Нет, у вас есть многострочная строка - есть разница!

Вы можете использовать шаблон регулярного выражения, чтобы соответствовать переносы строк, окруженными дополнительным пробелом, но не " символов:

$result = $result -replace '(?<!")\s*\r?\n\s*(?!")', ',' 

картина не состоит из:

  • (?<!") - не предшествующее " (отрицательная 'назад утверждение)
  • \s* - 0 или более символов пробелов
  • \r?\n - разрыв строки (CRLF или LF)
  • \s* - 0 или более пробельные символы
  • (?!") - не ниже " (отрицательного опережение утверждения)

И, наконец, заменяет вещь с ,

+1

Блестящий. Очень хорошее напоминание о нас отрицательных ** lookahead ** и ** lookbehind ** утверждения в регулярных выражениях – Djee

+0

Спасибо Матиасу. Он работал блестяще. – clicks010

+0

@ clicks010, вы очень желанны. Пожалуйста, подумайте о том, чтобы принять мой ответ, если он решает вашу проблему, нажав галочку слева –

0

Я не знаю, является ли это реальной проблемой XY, но вопрос нечеткий (путаница между многострочной строкой и массив, например). Решение от Матиаса прекрасное. Однако я думаю, что оригинальный плакат, в соответствии с ожидаемым результатом, пропустил правильный синтаксис для @ «» @Здесь строку, которая очень дословный: все ведущие пробелы были не преднамеренным.Следовательно, это:

[email protected]" 
"first","line","of","text" 
"second","line","of","text 
third","line","of","text" 
"fourth","line","of","text" 
"@ 
$result=$result -replace '(?<!")\r?\n(?!")', ',' 
write-output $result 

который привозит:

"first","line","of","text" 
"second","line","of","text,third","line","of","text" 
"fourth","line","of","text" 
0

с несколькими заменить

[email protected]" 
"first","line","of","text" 
"second","line","of","text 
third","line","of","text" 
"fourth","line","of","text" 
"@ 

(((($result -split "`n") -join """ ") -replace """ """, """`n""") -replace """ ", " ") -replace "\""`n", "`n" 
Смежные вопросы