标题: [问题求助] PowerShell如何用正则取=后面的字符? [打印本页]
作者: 5i365 时间: 2021-10-31 13:08 标题: PowerShell如何用正则取=后面的字符?
_$abctitle_大中国=小日本, 美国佬!
_$cdectitl_大中华=小日本, 英国佬!
把上面两行存成 test.txt, 用powershell =后面的内容
期待的结果:
使用包含 _$abctitle_ 的正则表达式, 获取 第一行 = 后面的 小日本, 美国佬!
同理:
使用包含 _$cdectitl_ 的正则表达式, 获取 第二行 = 后面的 小日本, 英国佬!
自己写了下面的powershell 脚本, 但是取不到值, 求高手指点, 感谢!
-----------------------------------------
(type -Encoding UTF8 "C:\Users\Administrator\Desktop\test.txt") -match '[^_$abctitle_(.*)]=(.+)'
$matches
作者: 5i365 时间: 2021-10-31 14:17
[^_$abctitle_(.*)]=(.+)$ 这样把 国=小日本, 英国佬! 干掉了, 但是 国= 字怎样搞掉
作者: xp3000 时间: 2021-10-31 15:17
(?<=_\$abctitle_...=).+$
作者: 5i365 时间: 2021-10-31 15:26
回复 3# xp3000
感谢, 我是在Powershell中匹配的, 试了下,取不到值, 您的应该是批处理要用的?
作者: 5i365 时间: 2021-10-31 15:29
本帖最后由 5i365 于 2021-10-31 15:47 编辑
回复 3# xp3000
(type -Encoding UTF8 "C:\Users\Administrator\Desktop\test.txt") -match '[^_$title_(.*)]=(.+)'
$matches
作者: xp3000 时间: 2021-10-31 15:36
我用的是软件,支持正则的很多都支持,除了早期的
EmEditor
作者: idwma 时间: 2021-10-31 15:59
- (type -Encoding UTF8 "C:\Users\Administrator\Desktop\test.txt") -match "^_$abctitle_.*=(.+)"
复制代码
作者: 5i365 时间: 2021-10-31 16:03
本帖最后由 5i365 于 2021-10-31 16:05 编辑
回复 7# idwma
感谢, 执行结果是 那两行完全输出了
正则中包含_$abctitle_
那就取包含_$abctitle_ 的那行中=后面的内容,即 小日本, 美国佬! 这几个字,
作者: 5i365 时间: 2021-10-31 16:06
回复 7# idwma
如正则表达式中包含 _$cdectitl_
那就取
小日本, 英国佬!
作者: 5i365 时间: 2021-10-31 16:33
回复 7# idwma
(@'
_$abctitle_大中国=小日本, 美国佬!
_$cdectitl_大中华=小日本, 英国佬!
'@) -match '[^_$abctitle_(.*)]=(.+)'
$matches
------------------------------------------------
用上面的方式还能取到值, 但是有两个值,
但是用下面的方法却取不了
------------------------------------------------
(type -Encoding UTF8 "C:\Users\Administrator\Desktop\test.txt") -match '[^_$abctitle_(.*)]=(.+)'
作者: idwma 时间: 2021-10-31 17:04
- foreach($a in (type test.txt)){if($a -match "^_$abctitle_.*=(.+)"){$matches[1]}}
复制代码
作者: 5i365 时间: 2021-10-31 17:07
回复 11# idwma
运行后没有值
作者: 5i365 时间: 2021-10-31 17:11
回复 11# idwma
用批处理如何实现从 test.txt中,
取包含 _$abctitle_ 所在行的 = 后面的字符
取包含 _$cdectitl_ 所在行的 = 后面的字符
作者: idwma 时间: 2021-10-31 17:23
回复 13# 5i365 - foreach($a in (type test.txt)){if($a -match "^_[$]abctitle_.*=(.+)"){$matches[1]}}
复制代码
作者: 5i365 时间: 2021-10-31 17:35
回复 14# idwma
还是不行, 转义 符 用 ` 也不行
作者: idwma 时间: 2021-10-31 17:42
回复 15# 5i365 - ((type test.txt) -match "_[$](abctitle|cdectitl)_") -replace "^.*=",""
复制代码
作者: 5i365 时间: 2021-10-31 17:44
回复 16# idwma
输出值是:
_$abctitle_澶т腑鍥?灏忔棩鏈? 缇庡浗浣?
_$cdectitl_澶т腑鍗?灏忔棩鏈? 鑻卞浗浣?
作者: idwma 时间: 2021-10-31 17:53
本帖最后由 idwma 于 2021-10-31 18:28 编辑
回复 17# 5i365
测了是可以的呀
作者: 5i365 时间: 2021-10-31 18:39
回复 18# idwma
刚试了一下, 要把test.txt的编码格式改为ansi 才可以
感觉可能还有更简单的办法
作者: 5i365 时间: 2021-10-31 18:42
回复 18# idwma
用这种办法 我需要先把_$abctitle_ 先改成 _[$](abctitle)_ 这样才可以
作者: 523066680 时间: 2021-10-31 21:28 标题: 串个频道
本帖最后由 523066680 于 2021-10-31 22:03 编辑
- use utf8;
- use Encode;
- my $str='
- _$abctitle_大中国=小日本, 美国佬!
- _$cdectitl_大中华=小日本, 英国佬!';
-
- while ( $str =~ /_\$\w+_[^=]*=(.+)$/gm) { print encode('gbk', $1),"\n" }
复制代码
Perl, 保存为 utf-8 执行
结果按GBK输出复制代码
作者: 5i365 时间: 2021-11-1 06:45
回复 21# 523066680
牛, 如果能在Powershell中用正则直接取就好了
作者: Batcher 时间: 2021-11-1 09:50
回复 1# 5i365
http://bcn.bathome.net/s/tool/index.html?key=sed- type 1.txt | find "_$abctitle_" | sed "s/.*=//" >2.txt
- type 1.txt | find "_$cdectitl_" | sed "s/.*=//" >3.txt
复制代码
作者: Batcher 时间: 2021-11-1 09:51
回复 1# 5i365
2.bat- @echo off
- for /f "tokens=2 delims==" %%i in ('type 1.txt ^| find "_$abctitle_"') do (
- set "str1=%%i"
- )
- for /f "tokens=2 delims==" %%i in ('type 1.txt ^| find "_$cdectitl_"') do (
- set "str2=%%i"
- )
- echo,%str1%
- echo,%str2%
- pause
复制代码
作者: 5i365 时间: 2021-11-1 10:07
回复 24# Batcher
如何在ps下使用cmd取值, 下面的方法, 取不到
cmd /c "for /f "tokens=2 delims==" %%i in ('type 1.txt ^| find "_$abctitle_"') do ( echo%%i)"
作者: 523066680 时间: 2021-11-1 10:37
本帖最后由 523066680 于 2021-11-1 13:10 编辑
'$abctitle' 字面强行保留原样(还是perl)- my $k1 = '$abctitle';
- my $k2 = '$cdectitl';
- while ( $str =~ /_(?:\Q$k1\E|\Q$k2\E)_[^=]*=(.+)$/gm) { print encode('gbk', $1),"\n" }
复制代码
或者在 $ 前面加斜杠,起码没有把它们从字面上拆开或者从中间插入其他符号- while ( $str =~ /_(?:\$abctitle|\$cdectitl)_[^=]*=(.+)$/gm) { print encode('gbk', $1),"\n" }
复制代码
作者: aloha20200628 时间: 2021-11-1 11:35
test.txt(简中编码):
_$abctitle_大中国=小日本, 美国佬!
_$cdectitl_大中华=小日本, 英国佬!
在powershell命令行运行代码如下:
foreach ($t in type 'test.txt') {$t=($t -replace '.*=');Write-Host $t;}
屏显运行结果:
小日本, 美国佬!
小日本, 英国佬!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |