developer tip

PowerShell로 문자열을 분할하고 각 토큰으로 작업 수행

optionbox 2021. 1. 11. 08:04
반응형

PowerShell로 문자열을 분할하고 각 토큰으로 작업 수행


파이프의 각 줄을 공백으로 분할 한 다음 각 토큰을 자체 줄에 인쇄하고 싶습니다.

다음을 사용하여이 결과를 얻을 수 있음을 알고 있습니다.

(cat someFileInsteadOfAPipe).split(" ")

하지만 더 많은 유연성을 원합니다. 각 토큰으로 무엇이든 할 수 있기를 원합니다. (예전 에 Unix에서 AWK 를 사용 했으며 동일한 기능을 얻으려고 노력하고 있습니다.)

나는 현재 :

echo "Once upon a time there were three little pigs" | %{$data = $_.split(" "); Write-Output "$($data[0]) and whatever I want to output with it"}

분명히 첫 번째 토큰 만 인쇄합니다. 토큰을 각각 하나씩 차례로 인쇄하는 방법이 있습니까?

또한 %{$data = $_.split(" "); Write-Output "$($data[0])"}제가 블로그에서 얻은 부분인데 제가하는 일이나 구문이 어떻게 작동하는지 정말 이해하지 못합니다.

나는 그것을 위해 구글을 원하지만 그것을 무엇이라고 부를지 모르겠다. Google에 한두 단어, 또는 %모든 $기호가하는 일과 여는 괄호의 중요성을 설명하는 링크로 저를 도와주세요 .

(cat someFileInsteadOfAPipe).split(" ")파일 (또는 선호하는 들어오는 파이프)에 두 줄 이상의 줄이 포함되어 있기 때문에 실제로 사용할 수 없다는 것을 알고 있습니다 .

일부 답변과 관련하여 :

Select-String토큰 화하기 전에 출력을 필터링하는 데를 사용 하는 경우 Select-String명령 의 출력 은 문자열 모음이 아니라 MatchInfo개체 모음 이라는 점을 명심해야 합니다. 분할하려는 문자열을 얻으려면 다음 과 같이 객체 Line속성에 액세스해야합니다 MatchInfo.

cat someFile | Select-String "keywordFoo" | %{$_.Line.Split(" ")}

"Once upon a time there were three little pigs".Split(" ") | ForEach {
    "$_ is a token"
 }

키는 $_파이프 라인의 현재 변수를 나타내는입니다.

온라인에서 찾은 코드 정보 :

%의 별칭입니다 ForEach-Object. 대괄호로 묶인 모든 것은 수신하는 각 개체에 대해 한 번씩 실행됩니다. 이 경우 단일 문자열을 전송하기 때문에 한 번만 실행됩니다.

$_.Split(" ")현재 변수를 가져와 공백으로 분할합니다. 현재 변수는 현재에 의해 반복되는 항목 ForEach입니다.


이를 달성하는 또 다른 방법은 Justus Thane과 mklement0의 답변을 조합하는 것입니다. 한 줄짜리 예제를 볼 때 이런 식으로하는 것은 말이되지 않지만, 파일이나 여러 개의 파일 이름을 대량 편집하려고 할 때 매우 편리합니다.

$test = '   One      for the money   '
$option = [System.StringSplitOptions]::RemoveEmptyEntries
$($test.split(' ',$option)).foreach{$_}

이것은 다음과 같이 나옵니다.

One
for
the
money

Justus Thane의 유용한 답변 을 보완하려면 다음을 수행하십시오 .

  • Joey가 주석에서 언급 했듯이 PowerShell에는 강력한 정규식 기반 -split 연산자가 있습니다.

    • 그것에서 단항 형태 ( -split '...') -split와 같은 동작합니다 awk'의 기본 필드 분할 , 어떤 의미 :
      • 선행 및 후행 공백은 무시됩니다.
      • 모든 실행 공백 (예들의 다수의 인접 공간)을 취급한다 단일 세퍼레이터.
  • 에서 PowerShell을 V4 때문에 빠르고 - - 식 기반 받는 대안을 ForEach-Object cmdlet을 사용 가능하게되었다 다음 .ForEach()수집 "연산자"(방법) 에 설명 된대로 이 블로그 게시물 합니다 (함께 .Where()방법, 더 강력한, 대안 표현 기반 Where-Object).

다음은 이러한 기능을 기반으로 한 솔루션입니다.

PS> (-split '   One      for the money   ').ForEach({ "token: [$_]" })
token: [One]
token: [for]
token: [the]
token: [money]

선두 및 후미 공백은 무시하는 것으로하고, 복수의 그 공간 Onefor단일 분리기로 처리 하였다.

참조 URL : https://stackoverflow.com/questions/11348506/split-string-with-powershell-and-do-something-with-each-token

반응형