需要在Windows中使用与SED相同的逻辑

时间:2009-08-13 09:25:15

标签: windows unix sed cmd

sed 's/^#//g' < kam_account_calls.txt > kam_account_calls1.txt

此命令从行的开头删除#。

请告诉我如何在Windows命令shell中采用相同的功能。

4 个答案:

答案 0 :(得分:2)

与此主题中的某些声音相反,这可以通过cmd完成,甚至可以直截了当地说明:

@echo off
rem enable some niceties we need here
setlocal enableextensions enabledelayedexpansion

rem loop through the file
for /f "delims=" %%x in (kam_account_calls.txt) do call :process %%x

endlocal
goto :eof

rem subroutine to remove # if present:
:process
set line=%*
rem if the first character of the line is #
if [%line:~0,1%]==[#] (
    rem then throw it away
    echo.!line:~1!
) else (
    rem else just output the line
    echo.!line!
)
goto :eof

这将遍历文件并输出删除了前导#字符的所有行。

它不能在普通的DOS中完成,这是正确的(虽然我不是确定,有些人在那里做了惊人的事情)。但几乎没有人在他的问题中包含DOS实际上意味着 DOS而不是Windows命令处理器cmd.exe

限制:

  • 行长限制在8190个字符左右。
  • 将跳过特殊的shell字符,例如<>
  • 将扩展环境变量(或伪变量,例如%random%%cd%

请记住这些,看看这是否会对您的文本文件造成影响。

可以找到代码和示例文件here

答案 1 :(得分:0)

DOS中没有开箱即用的功能,但您可以随时使用sed的众多端口之一,例如this one

编辑回答评论:由于DOS批处理文件只执行DOS命令(CMD的内部命令或程序),你不能不添加像sed这样的工具。

编辑“我们不能使用CMD”:不,不是在DOS下 - CMD没有读取文件并操纵它们的功能。你要么必须使用像sed或awk这样的现有程序,要么自己写一个。抱歉。甚至Unix / Linux也没有内置功能,但它们将sed和awk打包成开箱即用的程序。这不是DOS的情况。

显然,Windows使用环境变量(JohannesRössel的帽子)添加扩展来做这样的事情。我的DOS知道我显然已经变老了。

答案 2 :(得分:0)

你可以使用vbscript

Set objFS=CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file"
Set objFile = objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfStream
    strLine=objFile.ReadLine
    If Mid(strLine,1,1) = "#" Then
        strLine = Mid(strLine,2)
    End If 
    WScript.Echo strLine
Loop

输出

C:\test>more file
# this is a comment
this is one line #
blahb labh

C:\test>cscript /nologo test.vbs
 this is a comment
this is one line #
blahb labh

答案 3 :(得分:0)

安装Cygwin,然后您就可以直接使用 sed

(不是Windows命令shell,我知道,更像是类固醇上的命令shell)