使用sed和bc在文本文件中进行计算

时间:2019-01-29 16:12:43

标签: batch-file sed calculator

我有文本文件

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 

5 个答案:

答案 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 /??获取大量文档,以获取页面输出。