如何将sed命令组合到shell脚本中

时间:2013-11-22 17:59:59

标签: linux bash shell sed

我必须在文件上操作以下sed命令以删除该文件中的某些行。如何使用文件名作为变量将其作为shell scipt。或者有任何简单的方法来做这个shell脚本

sed -i '/^Total/d' delhi222517.txt 
sed -i '/^CBSE/d' delhi222517.txt 
sed -i '/^Keyword wise/d' delhi222517.txt
sed -i '/^wise/d' delhi222517.txt 
sed -i '/^Select A/d' delhi222517.txt
sed -i '/^Enter A/d' delhi222517.txt
sed -i '/^(Keyword/d' delhi222517.txt
sed -i '/^State Name/d' delhi222517.txt
sed -i '/^SNo/d' delhi222517.txt
sed -i '/^Disclaimer/d' delhi222517.txt
sed -i '/^provided/d' delhi222517.txt
sed -i '/^at$/d' delhi222517.txt 
sed -i '/^Designed/d' delhi222517.txt
sed -i '/^National/d' delhi222517.txt 
sed -i '/^$/d' delhi222517.txt 
sed -i '/^\t$/d' delhi222517.txt 
sed -i '/^\s$/d' delhi222517.txt
sed -i '/^         /d' delhi222517.txt
sed -i '/^    /d' delhi222517.txt 
sed -i 's/^\([0-9]\)/--\1/g' delhi222517.txt

5 个答案:

答案 0 :(得分:4)

变量很容易:

F=delhi222517.txt
sed -i '/^Total/d' "$F"
...

或者,如果要将文件名作为参数传递给脚本:

F="$1"
sed -i '/^Total/d' "$F"
...

但最好使用sed选项只调用一次。您可以使用:

sed -i \
    -e '/^Total/d' \
    -e '/^CBSE/d' \
    -e '/^Keyword wise/d' \
    ...  \
    delhi222517.txt

或者您可以使用完整脚本编写文件:

sed -i -f script.sed delhi222517.txt

或者如果你觉得足够聪明,你可以使用标准输入:

sed -i -f - delhi222517.txt << EOF
/^Total/d
/^CBSE/d
/^Keyword wise/d
...
EOF

答案 1 :(得分:4)

在命令行上

在命令行中,您可以使用分号或多个表达式参数分隔sed命令。作为一般例子:

# Using Semi-Colons
sed -i 's/foo/bar/; s/baz/quux/' infile

# Using Multiple Expressions
sed -i -e 's/foo/bar/' -e 's/baz/quux/' infile

编写完整的Sed脚本

通常,如果您的命令很多,请停止使用单行并构建完整的sed脚本。例如,您可以创建一个名为/tmp/foo.sed的文件,其中包含以下命令:

/^Total/d 
/^CBSE/d 
/^Keyword wise/d
/^wise/d
/^Select A/d
/^Enter A/d
/^(Keyword/d
/^State Name/d
/^SNo/d
/^Disclaimer/d
/^provided/d
/^at$/d
/^Designed/d
/^National/d
/^$/d
/^\t$/d
/^\s$/d
/^         /d
/^    /d
s/^\([0-9]\)/--\1/g

然后立即调用您的命令。例如,使用GNU sed:

infile='delhi222517.txt'
script='/tmp/foo.sed'
sed --in-place --file="$script" "$infile"

答案 2 :(得分:2)

你可以把它们放在像这样的shell脚本中:

#!/bin/bash

# some sanity checks
file="$1"

sed -i '/^Total/d' "$file"
sed -i '/^CBSE/d' "$file"
sed -i '/^Keyword wise/d' "$file"
sed -i '/^wise/d' "$file"
#.. more sed commands

顺便说一下你的各种sed命令可以使用reges组合成1个或更少的sed命令:

sed -r -i '/^(Total|CBSE)/d' "$file"

答案 3 :(得分:1)

使用awk,您可以完成所有操作:

file=delhi222517.txt
awk '!/^(Total|CBSE|Keyword wise|wise)/' "$file"

答案 4 :(得分:1)

如果你的脚本不会运行除了你的文件以外的任何程序,那么这可能是最简单的设置方式:

#!/bin/sed -f     # <- run the file passed to the program from the command-line
/^Total/Id        # /I is the case-insensitive flag, replacing sed -i
/^CBSE/Id
/^Keyword wise/Id
/^wise/Id
/^Select A/Id
/^Enter A/Id
...

使上述脚本可执行,然后只传递您要转换的文件名: ./mysedscript delhi222517.txt