变量模式与sed

时间:2017-09-09 10:15:01

标签: windows batch-file sed

我在路径d:\ test \中有一个名为test.txt的文本文件 此文件有不同的文本示例:

exampel blas asdlkwe3 asd f3 234 df
exampel blas asdlkwe3 asd f3 234 df
exampel blas asdlkwe3 asd f3 234 df
exampel blas asdlkwe3 asd f3 234 df
exampel blas asdlkwe3 asd f3 234 df
exampel blas asdlkwe3 asd f3 234 df
Presents: d:\test\asdf\bla
exampel blas asdlkwe3 asd f3 234 df
exampel blas asdlkwe3 asd f3 234 df
exampel blas asdlkwe3 asd f3 234 df
exampel blas asdlkwe3 asd f3 234 df
exampel blas asdlkwe3 asd f3 234 df

在文件test.txt中,如果一行包含“Presents:d:\ test \ asdf \ bla” 我需要d:\ test \ asdf \ bla作为变量。只有礼物:它总是一样的。下一个单词可以用其他东西

d:\ test \ addons \ sed.exe是正确的。

@echo off
if "%aufruf%"=="" (
SETLOCAL
)

set 1=
set file=d:\test\test.txt
for /f "delims=" %%a in ("d:\test\addons\sed.exe" -n /Presents:/P %| 
"d:\test\addons\sed.exe" "s/Presents: //g" %file%) do set 1=%%a
echo %1%
pause

如下所示,输出为空:

d:\test>test2.bat

d:\_test>

3 个答案:

答案 0 :(得分:1)

@echo off
if "%aufruf%"=="" (
SETLOCAL
)

set data=
set file=d:\test\test.txt
for /f "usebackq tokens=1*delims= " %%a in ("d:\test\test.txt") do if "%%a"=="Presents:" set data=%%b
echo %data%
pause

将空格(delims值)上的文件分隔为标记;第一个转到%%a,第二个转到%%b

如果%%aPresents:,则将%%b分配给data

显示data

答案 1 :(得分:0)

关于主题窗口/批处理文件解决方案:

使用sed(gnuwin32):

@echo off
set "data=n/a"
set "file=.\test.txt"

for /f "delims=" %%a in (
    'sed -n "s/^Presents: //p" "%file%"'
) do set "data=%%a"

echo %data%

pause

纯批次替换三行for /f .. do

for /f "tokens=1* delims=: " %%a in (
    'findstr /I "^Presents:" %file%'
) do set "data=%%b"

使用PowerShell替换三行for /f .. do

for /f "usebackq delims=" %%a in (
    `powershell -NoP -C "sls '(?<=^Presents: )(.+)$' '%file%'|%%{$_.matches.groups[1].value}"`
) do set "data=%%a"

答案 2 :(得分:-1)

所以,如果你的机器上有unix风格的sed,你为什么要写windows批处理文件?直接转到bash脚本并使用bash代替cmd运行它们。

无论如何,您需要先删除所有不相关的行,然后从剩余部分中删除Presents:

grep '^Presents: ' test.txt | sed 's/Presents: //'

我不熟悉cmd批处理文件,但shell脚本看起来像这样:

#!/bin/bash

magicstring="Presents: "
outvariable=$(grep "^$magicstring" < $1 | sed "s/$magicstring//")
echo $outvariable