programing

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

newsource 2023. 10. 17. 20:18

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

저는 파이프의 각 줄을 공간에 나누어 각각의 토큰을 고유의 줄에 인쇄하고 싶습니다.

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

(cat someFileInsteadOfAPipe).split(" ")

하지만 저는 좀 더 융통성을 갖고 싶습니다.저는 각 토큰을 가지고 무엇이든 할 수 있기를 원합니다. (저는 유닉스에서 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])"}블로그에서 얻은 부분인데 제가 무엇을 하고 있는지, 구문이 어떻게 작동하는지 정말 이해가 되지 않습니다.

구글에서 검색하고 싶은데 뭐라고 불러야 할지 모르겠어요.구글에 한 두 단어를 알려주거나, 무엇이 무엇인지 설명해주는 링크를 도와주세요.%그 밖의$기호뿐만 아니라 열림 및 닫힘 괄호의 중요성도 포함됩니다.

실제로 사용할 수 없다는 것을 알고 있습니다.(cat someFileInsteadOfAPipe).split(" "), 파일(또는 바람직한 수신 파이프)에 두 줄 이상이 포함되어 있기 때문입니다.

일부 답변에 대해서는 다음과 같습니다.

토큰화하기 전에 출력을 필터링하기 위해 를 사용하는 경우에는 출력의 출력을 염두에 두어야 합니다.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"
 }

핵심은.$_, 파이프라인의 현재 변수를 나타냅니다.

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

%는 에 대한 별칭입니다. 괄호 안에 포함된 모든 항목은 받는 개체마다 한 번씩 실행됩니다.이 경우에는 한 번만 실행됩니다. 문자열 하나를 전송하기 때문입니다.

$_.Split(" ")현재 변수를 사용하여 공간에 분할하는 것입니다.현재 변수는 현재 로핑 중인 변수입니다.ForEach.

Justus Grunow의 유용한 답변을 보완하기 위해:

  • Joey가 코멘트에서 언급했듯이, PowerShell은 강력한 정규 운영자를 보유하고 있습니다.

    • 단항 형식()-split '...'에서는 기본 필드 분할과 같이 동작합니다.
      • 선행 및 후행 공백은 무시됩니다.
      • 빈 공간(예: 인접한 여러 공간)의 실행은 단일 구분자로 처리됩니다.
  • PowerShell v4+에서는 cmdlet대한 표현 기반(따라서 더 빠른 표현 기반)을 사용할 수 있게 되었습니다. 본질적인 방법(방법과 함께 보다 강력한 표현 기반의 대안).

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

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

선행 공백과 후행 공백은 무시되었고, 다음 공백 사이의 다중 공백은 무시되었습니다.One그리고.for하나의 분리막으로 취급되었습니다

-split는 배열을 출력하며, 다음과 같은 변수에 저장할 수 있습니다.

$a = -split 'Once  upon    a     time'
$a[0]

Once

또 다른 귀여운 점은 할당 문장의 양쪽에 배열을 가질 수 있다는 것입니다.

$a,$b,$c = -split 'Once  upon    a'
$c

a

이를 위한 또 다른 방법은 Justus Thane의 답변과 mklement0의 답변을 결합한 것입니다.하나의 라이너(linear) 예제를 볼 때는 이 방법을 사용하는 것이 합리적이지 않지만 파일이나 여러 파일 이름을 대량 편집하려고 할 때는 매우 편리합니다.

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

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

One
for
the
money

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