今天有个小需求,用 awk 和 sed 貌似不能很好的完成任务,打算转战 perl 了

2018-12-05 20:38:20 +08:00
 hujianxin

有一个文件,a.txt ,文容如下:

0689LM  name=S:321, password=154adfv839473, value=37461278216723
1633LM  name=S:241, password=15sdf78839611, value=21
1121LM  name=S:673, password=1543978839612, value=1230
1212LM  name=S:854, password=fd43978df9621, value=383242544
3323LM  name=S:456, password=sd9788396sdd3, value=11211
3322LM  name=S:234, password=dsfas78839623, value=23121
4238LM  name=S:254, password=1fdsafdsafdsa, value=324342
51LM    name=S:903, password=fdsafsdafsdaf, value=43543
2389LM  name=S:572, password=fdsfdsdfwefff, value=2343235
91452LM name=S:842, password=sdfwef23dffds, value=3434324
9553LM  name=S:fed, password=23fdssfdss32f, value=10501342176

需求:输出第一列的反转,name=S:之后的数字,value 之后的数值,如下:

ML9860 321 37461278216723
ML3361 241 21
ML1211 673 1230
ML2121 854 383242544
ML3233 456 11211
ML2233 234 23121
ML8324 254 324342
ML15 903 43543
ML9832 572 2343235
ML25419 842 3434324
ML3559 fed 10501342176

awk,不好实现第一列的反转

sed,不好显示抓取 name=S:之后的数字(需要非贪婪)

当然,也可能是我才疏学浅,如果各位大佬有更好的解决方法,欢迎指教。

perl -aE '/name=S:(.*?),.*?value=(.*)/; $a = reverse $F[0]; say "$a $1 $2"' a.txt

6827 次点击
所在节点    程序员
86 条回复
aliipay
2018-12-06 20:53:21 +08:00
@shyrock 差不多吧,所以正确方法应该是选取一个合适的工具。
lululau
2018-12-06 21:27:02 +08:00
学开汽车比学开飞机容易,所以汽车比飞机好,见识短没关系,但是保持开放的心态,先了解再判断
no1xsyzy
2018-12-06 22:44:37 +08:00
@Kirscheis 不至于让大家都觉得遗留的脚本是天书+1
这就是我为什么会反对 python 里加 “:=”
ps1aniuge
2018-12-07 13:53:42 +08:00
#建议保存编码为:bom 头 + utf8

$输入文件 = 'a:\pscode\TEMP_2018\temp207\aaa.txt'
$输出文件 = 'a:\pscode\TEMP_2018\temp207\aaa2.txt'

function 翻转函数($a)
{
$b = $a.tochararray()
[System.Array]::Reverse($b)
[string]$c = [system.String]::Concat($b)
return $c
}

$所有行 = Get-Content -LiteralPath $输入文件 -ReadCount 0
$输出的所有行 = @()
foreach ($行 in $所有行)
{
$列 = $行.split(' ',[System.StringSplitOptions]::RemoveEmptyEntries)
$列 1 = 翻转函数 $列[0]
$列 2 = $列[1].replace('name=S:','').trimend(',')
$列 3 = $列[3].replace('value=','')
$新列 = $列 1,$列 2,$列 3 -join ' '
$输出的所有行 += $新列
}
Set-Content -LiteralPath $输出文件 -Encoding UTF8 -Value $输出的所有行

powrshell 代码,win,linux 通用。
源文件不要有尾部空行。
测试通过。
ps1aniuge
2018-12-07 13:56:48 +08:00
$列 3 被 V2EX 人为分词了,不怪我
ps1aniuge
2018-12-07 14:44:43 +08:00
用法:
在 linux 的 bash 中,用我分享的 powershell 脚本的方法:(需要先安装 linux 版 powershell )
/usr/bin/pwsh -f "fz 翻转字符串.ps1" -输入字符串 'abcd'



#建议保存编码为:bom 头 + utf8
param
(
[string]$输入字符串
)

$b = $输入字符串.tochararray()
[System.Array]::Reverse($b)
$c = [system.String]::Concat($b)
return $c

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/514702

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX