sed命令在多个条件下编辑文件

时间:2017-01-17 15:58:32

标签: shell unix sed

我的文件有多行,需要根据需要进行处理。我找到了一个用变量做这个的脚本,但我不想用变量做这个,因为这会让我的代码变得更复杂

文件:

Id,Name,class,Section
1,Dileep,MBA,B
2,Pavan,tenth,C
3,Girish,graduate,D

我的输出文件应该是这样的 -

文件:

Id,Name,Class,Section
1,Dileep,MBA,B
2,Pavan,MCA,C
3,Girish,MBA,D

我使用sed命令执行此操作,下面是我为此创建的脚本。

#! /bin/sh
file=/tmp/dileep/details.txt

cat $file | sed '/Id,Name,/s/class/**C**lass/g' | tee -a $file 
cat $file | sed '/2,Pavan,/s/tenth/**MCA**/g' | tee -a $file
cat $file | sed '/3,Girish,/s/graduate/**MBA**/g' | tee -a $file

我能够让第一行更改带标题的那一行,而不是实际数据,这将是硬编码数据,我可以进行此更改。

您能否告诉我我的错误以及如何纠正错误。

2 个答案:

答案 0 :(得分:1)

首先(!)

你不能像这样使用T恤。一旦输入文件大于tee使用的缓冲区大小,您将松散输入文件。

关于这个话题,你的意思是这样吗?

我会使用awk

sanitize.awk

BEGIN {
    FS=OFS=","
}

$3=="class" {
    $3="Class"
}

$3=="tenth"{
    $3="MCA"
}

$3=="graduate" {
    $3="MBA"
}

{
    print
}

像以下一样运行:

awk -f sanitize.awk input.file > output.file
mv output.file > input.file

答案 1 :(得分:0)

您可以以不同的方式使用sed。我将首先修复你的脚本

file=/tmp/dileep/details.txt
output=/tmp/dileep/details.out
# Off-topic: cat $file | sed '...' can be replaced by sed '...' $file
cat $file | sed '/Id,Name,/s/class/**C**lass/g' |
            sed '/2,Pavan,/s/tenth/**MCA**/g' |
            sed '/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output}

使用sed,您可以使用选项-e

file=/tmp/dileep/details.txt
output=/tmp/dileep/details.out
# No spaces after the last '\' of the line!
cat $file | sed -e '/Id,Name,/s/class/**C**lass/g' \
                -e '/2,Pavan,/s/tenth/**MCA**/g' \
                -e '/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output}

或者你可以使用1长命令(看起来很可怕):

cat $file | sed -e \
  '/Id,Name,/s/class/**C**lass/g;/2,Pavan,/s/tenth/**MCA**/g;/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output}

这里需要的是命令文件:

cat /tmp/dileep/commands.sed
/Id,Name,/s/class/**C**lass/g
/2,Pavan,/s/tenth/**MCA**/g
/3,Girish,/s/graduate/**MBA**/g

并使用

cat $file | sed -f /tmp/dileep/commands.sed | tee -a ${output}

或更好,避免cat

sed -f /tmp/dileep/commands.sed ${file} | tee -a ${output}