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]
선두 및 후미 공백은 무시하는 것으로하고, 복수의 그 공간 One
및 for
단일 분리기로 처리 하였다.
'developer tip' 카테고리의 다른 글
Meteor가 실행되는 동안 다른 클라이언트에서 Meteor의 MongoDB에 어떻게 액세스합니까? (0) | 2021.01.11 |
---|---|
파이썬에서 고정 크기 형식의 문자열을 어떻게 만듭니 까? (0) | 2021.01.11 |
Android에서 파일 생성 시도 : 열기 실패 : EROFS (읽기 전용 파일 시스템) (0) | 2021.01.11 |
bitbucket으로 푸시 할 수 없습니다. 권한이 거부되었습니다 (공개 키). (0) | 2021.01.11 |
JSON jsonObject.optString ()은 문자열 "null"을 반환합니다. (0) | 2021.01.11 |