如何在PowerShell中执行此操作?或者:用于文件和字符串操作的语言是什么?

Pet*_*ter 4 string powershell scripting file-io

我应该使用什么语言进行文件和字符串操作?

这似乎是客观的,但我认为并非如此.关于这一点有很多话要说.例如,我可以清楚地看到,对于大多数用法而言,Perl将是比Java更明显的候选者.我需要经常这样做,此时我使用C#,但我想要一个更像脚本的语言来做到这一点.

我可以想象Perl会成为它的候选者,但我想在PowerShell中做到这一点,因为PowerShell可以访问.NET库(简单).或者Python是否适合它?如果我必须学习一门新语言,那么Python肯定是我的名单之一,而不是Perl.

我想要做的是,例如,读取文件,进行一些更改并再次保存.例如:打开它,对所有行(比如3位数)进行编号并关闭它.任何语言的任何例子都是受欢迎的,但越短越好.这是实用程序脚本我在这里,而不是OO,TD开发,单元测试的东西当然.

我非常希望看到的是(伪代码):

open foobar.as f

foreach  line in f.lines 
 line.addBefore(currenIteratorCounter.format('ddd') + '. ')

close f
Run Code Online (Sandbox Code Playgroud)

所以:

bar.txt 

Frank Zappa
Cowboy Henk
Tom Waits

numberLines bar.txt

bar.txt 

001. Frank Zappa
002. Cowboy Henk
003. Tom Waits
Run Code Online (Sandbox Code Playgroud)

更新:

这里的Perl和Python示例非常棒,绝对符合我的希望和期望.但那里没有PowerShell人吗?

Joe*_*oey 11

这在PowerShell中实际上非常简单:

function Number-Lines($name) {
    Get-Content $name | ForEach-Object { $i = 1 } { "{0:000}. {1}" -f $i++,$_ }
}
Run Code Online (Sandbox Code Playgroud)

我在这里做的是获取文件的内容,这将返回一个String[],我在其上迭代ForEach-Object并使用-f运算符应用格式字符串.结果刚刚从管道中退出,另一个String[]可以根据需要重定向到文件.

您可以使用别名缩短一点:

gc .\someFile.txt | %{$i=1}{ "{0:000}. {1}" -f $i++,$_ }
Run Code Online (Sandbox Code Playgroud)

但我不建议用于函数定义.

你想要考虑使用两个传递,然后动态构造格式字符串以适应更多行.如果有1500条线,{0:000}那么整齐排列输出就不够了.

至于哪种语言最适合此类任务,您可能会考虑诸如此类的因素

  • 代码的简洁性(Perl在那里很难被击败,特别是在另一个答案中的单行)
  • 代码的可读性和可维护性
  • 工具的可用性(默认情况下,Windows上未安装Perl和Python(仅限Windows 7以来的PowerShell),因此部署可能会受到阻碍.)

根据最后一点,您甚至可以更好地使用cmd此任务.代码同样非常简单:

@echo off
setlocal
set line=1
for /f "delims=" %%l in (%1) do call :process %%l
endlocal
goto :eof

:process
call :lz %line%
echo %lz%. %*
set /a line+=1
goto :eof

:lz
if %1 LSS 10 set lz=00%1&goto :eof
if %1 LSS 100 set lz=0%1&goto :eof
set lz=%1&goto :eof
goto :eof
Run Code Online (Sandbox Code Playgroud)

当然,这假定它必须运行在除您自己的机器之外的其他地方.如果没有,那么使用适合您需求的任何东西:-)

  • 这是一个出色的答案(我将加入书签),但我只是想指出,我认为你已经证明了Powershell通常就是答案.它使这种事情变得如此简单,创建一个包装它的功能通常是浪费时间.您可以将$ i的初始化内联以使其成为单行.它比Perl更具可读性.最后,PowerShell是一个操作系统"更新",这使得获得安装它的权限更容易一些.很快,它将默认安装在Window的操作系统上,我相信从Windows 7开始. (3认同)