1

したがって、次のようなテキストファイルがあります。

Members : {USER\member1, USER\member2, US
           ER\member3, USER\member4, USER
           \member5, USER\member6}

を削除したいと思いUSER\ます。次のコードはそれを削除しますが、たとえば、USある行とER\別の行にある場合など、改行で分割されている場合は削除しません。

Foreach-Object { %{$_.Replace('USER\', '') }

そこに入れ`n or `rてもうまくいきません。どんな助けでも大歓迎です。

4

3 に答える 3

4

これを試して:

PS > ((Get-Content .\t.txt) | % { $_.Trim() }) -join "" -replace "USER\\"
Members : {member1, member2, member3, member4, member5, member6}

テキストが文字列配列にある場合は、(Get-Content .\t.txt)変数で切り替えます。文字列(配列ではない)変数にテキストがある場合は、次を使用します。

($MYSTRINGVAR.Split("`r`n") | % { $_.Trim() }) -join "" -replace "USER\\"

EDIT「メンバー」部分を変更するだけです:

$text = (Get-Content .\input.txt) -join "`r`n"
($text | Select-String '(?s)(?<=Members : \{)(.+?)(?=\})' -AllMatches).Matches | % {
        $text = $text.Replace($_.Value, ($_.Value -split "`r`n" | % { $_.Trim() }) -join "" -replace "USER\\")
}
$text | Set-Content output.txt
于 2013-02-12T20:07:09.733 に答える
0

そこにたどり着くにはもっと簡単な方法があるかもしれませんが、次の方法を試してみてください。

$Text = @'
Members : {USER\member1, USER\member2, US
           ER\member3, USER\member4, USER
           \member5, USER\member6}
'@

# First - USER\ with newline inside..
foreach ($index in 1..4) {
    $Text = $Text -replace ('USER\\'.Insert($index,'(\r\n\s+)')), '$1'
}

# Than - pure USER\
$Text = $Text -replace 'USER\\'
$Text

ご覧のとおり、結果にその要素を含めて保持するいくつかのパターンを作成します ( , '$1')。単純なものの場合-使用するテキストを作成するためにヒアストリングを使用した USER\ を削除するだけです。実際のファイルには \r が必要ない可能性があります

于 2013-02-12T21:37:36.560 に答える
0

これは実際にはGraimer のソリューションへの単なるコメントですが、コメントとしては長すぎて読みにくいため、代わりに (補足) 回答にしています。

削除後に文字列を再ラップするには、次のUSER\ようにします。

$s = "Members : {member1, member2, member3, member4, member5, member6}"

$s -match '^(.*?{)(.*)(})$'
$pad = " " * $matches[1].Length
$matches[1] + ($matches[2] -replace '(.{1,20},) ', "`$1`r`n$pad") + $matches[3]

$matches最初の正規表現は、コレクションを介してアクセスできる 3 つの部分に文字列を分割します。

Name  Value
----  -----
3     }
2     member1, member2, member3, member4, member5, member6
1     Members : {
0     Members : {member1, member2, member3, member4, member5, member6}

$matches[1]は左中括弧を含むプロローグ、$matches[2]はメンバー リスト、$matches[3]は右中括弧です。$matches[2]これで、必要な長さでラップするだけで済みます。

'(.*{1,20},) '

上記は、「コンマとスペースが続く最大 20 文字の最長一致」を意味します。これを 1 番目のグループ ( ) の後に改行 (``r $pad`) を付けて置き換え$1プロローグn``) and a number of spaces that matches the length of the prologue (と末尾の中かっこでつなぎ合わせます。

于 2013-02-12T21:56:37.127 に答える