我有文本文件
select 1
Something else 1
select 2
Something else 2
select 3
Something else 3
select 4
Something else 4
我需要用某种算术定律(例如,以1为单位)来更改select
字附近的所有数字。
预期输出(数字增加2)
select 3
Something else 1
select 4
Something else 2
select 5
Something else 3
select 6
Something else 4
我对Windiws的尝试(我使用了http://gnuwin32.sourceforge.net中的端口unix实用程序,也使用了变量PATH中的所有路径)
bc-基本计算器
@echo off
sed -i -r -e "s/select\s[0-9]+/.../g" %1 | bc
pause
exit
答案 0 :(得分:3)
在没有第三方工具的纯批处理中(限于32位带符号整数):
:: Q:\Test\2019\01\29\SO_54425239.cmd
@Echo off&SetLocal EnableDelayedExpansion
Set "Increment=2"
for /f "tokens=1*" %%A in (%1) do if "%%A"=="select" (
Set /A "Number=%%B + Increment"
Echo:%%A !Number!
) Else Echo:%%A %%B
样品运行:
> Q:\Test\2019\01\29\SO_54425239.cmd file.txt
select 3
Something else 1
select 4
Something else 2
select 5
Something else 3
select 6
Something else 4
答案 1 :(得分:2)
PowerShell可以相当轻松地做到这一点:
$increment = 1 # How much to add
$sourcefile = ".\unincrement" # Full path of the original data
$destfile = ".\incremented" # Full path of the changed data - should be different from original, but doesn't actually have to be with PowerShell.
(Get-Content $sourcefile) | ForEach-Object { if ($_ -match "select (\d+)") { "select $($increment + $Matches[1])"} else { $_ } } | Out-File $destfile -Append
您可以将实际值放在最后一行,而不用使用$increment
,$sourcefile
和$destfile
。
答案 2 :(得分:1)
这是GNU awk的工作,而不是sed的工作:
gawk 'BEGIN{RS="\r?\n";ORS="\r\n"} /^^select [0-9]+/{$2+=2}1'
我已经逃脱了^
。试试看,看看是否有效。
您可以添加-i inplace
开关以进行更改-鉴于您的GNU awk为v4.1.0
+。
那将给出:
gawk -i inplace 'BEGIN{RS="\r?\n";ORS="\r\n"} /^^select [0-9]+/{$2+=2}1' %1
要替换批次中的sed
行。
为避免出现问题,另一种方法是使用双引号,例如:
> gawk "BEGIN{RS=\"\r?\n\";ORS=\"\r\n\"} /^^select [0-9]+/{$2+=2}1" input.txt
select 3
Something else 1
select 4
Something else 2
select 5
Something else 3
select 6
Something else 4
顺便说一句,由于您在Windows上,因此我将回车\r\n
用作ORS
,如果不需要回车,则可以更改或删除设置(默认为\n
)
答案 3 :(得分:1)
这可能对您有用(GNU sed):
sed -E 's/(select )(.*)/echo '\''x=2+\2;print "\1"; x'\''| bc/e;' file
select
上的模式匹配及其编号,通过管道将bc命令回显到bc,并使用seds替换命令上的e
标志来评估命令。
使用bash的替代方法:
sed -E 's/(select )(.*)/echo "\1$((2+\2))"/e' file
答案 4 :(得分:1)
假设用户输入的文件为“ test.txt”,则将JREPL.BAT与用户提供的JavaScript一起使用
jrepl "(select )(\d+)" "$txt=$1+(parseInt($2)+2)" /jq /f test.txt
以上内容的输出将打印到屏幕(stdout)
添加/o new.txt
将输出写入新文件,或添加/o -
覆盖原始文件。
JREPL.BAT是纯脚本(混合JavaScript /批处理),可从XP开始在任何Windows计算机上本机运行,而无需任何第三方exe文件。可从命令行通过jrepl /?
或jrepl /??
获取大量文档,以获取页面输出。