使用shell脚本替换文本文件中的单词组

时间:2014-01-22 06:40:32

标签: perl bash shell

我想用低于内容的文本文件中的“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

1 个答案:

答案 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