2010-11-17 68 views
1

什么,我想做一个简单的例子更换:复杂的文本命令行

我有一个文件:input.txt中,它看起来像

a 2 4 b 
a 3 8 b 
c 9 4 d 
a 3 4 8 b 

和脚本:add.sh这需要命令行参数并返回它们的总和

我想为input.txt搜索模式'a (.*) b'的所有实例,其中我将(。*)部分作为命令行参数传递给add.sh.

例如,我想要做一些类似sed 's/a \(.*\) b/a {add.sh \1} b/g' input.txt (当然不起作用)。 所以输出应该看起来像

a 6 b 
a 11 b 
c 9 4 d 
a 15 b 

什么是做到这一点的最简单的方法?

感谢

回答

0
perl -pe 's/a (.*) b/"a ".`add.sh $1`." b"/eg' input.txt 

只要确保add.sh不输出换行符。

0

如果Perl是不是一种选择,你可以 脚本它是这样的:

grep -e '^a .* b$' input.txt | sed -e 's/a \(.*\) b/\1/g' | while read LINE; do ./add.sh $LINE; done 

我意识到上面没有解决您的问题,我只是专注于您的sed表达。

但是,如果你是热衷于解决在使用另一个shell脚本这个问题的话,大概是这个样子:

cat input.txt | while read LINE; do 
    if [[ "$LINE" =~ ^a (.*) b$ ]]; then 
     echo -n "a " 
     add.sh ${BASH_REMATCH[1]} 
     echo " b" 
    else 
     echo $LINE 
    fi 
done 
0

如果add.sh是:

#!/bin/sh 
arg1=$1 
nums=$2 
shift 2 
for i in $nums 
do 
    sum=$((sum+i)) 
done 
echo "$arg1 $sum [email protected]" 

,那么你可以这样做:

sed 's/^\([^ ]* \)\(.*\)\([^ ]*\)$/\1\"\2\"\3/' input.txt | xargs -L 1 ./add.sh 

这将在每一行添加数字。只为与“a”和以“b”结束开始的行添加它们使用此:

sed 's/^a \(.*\) b$/a \"\1\" b/' input.txt | xargs -L 1 ./add.sh 

的“C 9 4 d”行仍由add.sh处理但sed命令不添加任何引号,所以脚本只看到“9”为$2,所以总和只做一次,结果为“9”。 “4”被视为[email protected]的其余部分。