我想用低于内容的文本文件中的“Value(ifqlen)25”“Value(ifqlen)75”“Value(ifqlen)100”替换值(ifqlen)50
设置val(ifqlen)50;
设置opt(x)652;
设置opt(y)752;
设置stopTime 999;
$ new config -protype(ll)\
-ifqLen $val(ifqlen) \
我使用的perl脚本是for循环,如下所述:
for i in 25 50 75 100
do
perl -pi -e "s/val\(ifqlen\) \K50/$i/g" /home/guest/Desktop/file.txt
#perform logic#
perl -pi -e "s/val\(ifqlen\) \K$i/50/g" /home/guest/Desktop/file.txt
done
OUTPUT:第一次执行for循环时是完美的
OUTPUT:第二次执行for循环时
设置val(ifqlen)25;
设置opt(x)652;
设置opt(y)752;
设置stopTime 999;
$ new config -protype(ll)\
-ifqLen $val(ifqlen) **25\**
OUTPUT:第三次执行for循环时
设置val(ifqlen)2525;
设置opt(x)652;
设置opt(y)752;
设置stopTime 999;
$ new config -protype(ll)\
-ifqLen $val(ifqlen) **2525\**
期望的输出
设定val(ifqlen)25; #second time 50; #Third时间75,最后100;#
设置opt(x)652;
设置opt(y)752;
设置stopTime 999;
$ new config -protype(ll)\
-ifqLen $val(ifqlen) \
@BroSlow:
已输入test.sh文件中的代码,如下所示
for i in 25 50 75 100;
DO
while read -r line;
DO
echo "$line" | sed -e "s/set val(ifqlen) .*;/set val(ifqlen) 100;/"
完成< “/home/makodia/Desktop/file.txt”
完成
这显示了终端的内容。文本文件仍然保持不变。该怎么做?在终端上显示完美的结果。
我正在使用的解决方案:
perl -pi -e“s / val(xyz)\ K50 / 100 / g”/home/guest/Desktop/text.tcl
执行逻辑;
perl -pi -e“s / val(xyz)\ K100 / 50 / g”/home/guest/Desktop/text.tcl
答案 0 :(得分:2)
不确定您要使用perl做什么或为什么要使用它,但根据您所需的输出判断,您可能需要如下所示。可能更简单,但真的很困惑你正在尝试做什么。注意${line/something/somethingelse}
使用bash替换并用变量“$ line”中的somethingelse替换某些内容(*匹配val(ifqlen)
之后的空格与;
的下一个出现之间的任何内容)。此外,-r
上需要read
,因此它会忽略您的转义字符。
#!/bin/bash
IFS=$'\n'
for i in 25 50 75 100; do
while read -r line; do
echo "${line/set val(ifqlen) *;/set val(ifqlen) $i;}"
done < "/home/guest/Desktop/file.txt"
done
示例输出
> ./abovescript
set val(ifqlen) 25;
set opt(x) 652;
set opt(y) 752;
set stopTime 999;
$new config -protype(ll) \
-ifqLen $val(ifqlen) \
set val(ifqlen) 50;
set opt(x) 652;
set opt(y) 752;
set stopTime 999;
$new config -protype(ll) \
-ifqLen $val(ifqlen) \
set val(ifqlen) 75;
set opt(x) 652;
set opt(y) 752;
set stopTime 999;
$new config -protype(ll) \
-ifqLen $val(ifqlen) \
set val(ifqlen) 100;
set opt(x) 652;
set opt(y) 752;
set stopTime 999;
$new config -protype(ll) \
-ifqLen $val(ifqlen) \
除了bash替换,你也可以使用
echo "$line" | sed -e "s/set val(ifqlen) .*;/set val(ifqlen) $i;/"
或
sed -e "s/set val(ifqlen) .*;/set val(ifqlen) $i;/" <<< "$line"
<强>更新强>
您可以立即将文件读入变量,然后从变量中读取read
并写入文件。客观地说,这不是最佳选择,因为它可以清空您的文件并且无法写入文件,因此只留下一个空文件(如果您的文件最初为空,即使使用cp
)。对于非常大的文件,它也会有缓冲问题。
#!/bin/bash
IFS=$'\n'
input=$(<"/home/guest/Desktop/file.txt")
cp /home/guest/Desktop/file.txt /home/guest/Desktop/.backup_file.txt
: > "/home/guest/Desktop/file.txt"
for i in 25 50 75 100; do
while read -r line; do
echo "$line" | sed -e "s/set val(ifqlen) .*;/set val(ifqlen) $i;/" >> "/home/guest/Desktop/file.txt"
done < "$input"
done