将所有 sed 命令放入一个 shell 脚本文件中

将所有 sed 命令放入一个 shell 脚本文件中

本质上,我得到了一个文本文件,并应该通过 sed 命令对其进行处理。我总共有大约 7 个 sed 命令,需要将它们全部放在一个 shell 脚本中,以便在运行该脚本时产生一个输出。

要处理的文本文件:students.txt

学生.txt:

DogG DOGGGGGGGG
dog dog dog Jamesb
JamesBrady
derghnregnrig
JamesBeody

因此,第一个 sed 删除了第一行和最后一行。第二个 sed 将 dog 替换为 DOGGGG。第三个 sed 查找并打印所有带有 JamesBrady 的行。第四个 sed 查找并打印所有带有 derghnregnrig 的行。

Sed 命令(BS 示例):

sed -e '1d' -e '$d' -e '/^$/d' students.txt
sed -n s/dog/DOGGGG/g students.txt
sed -n /JamesBrady/p students.txt
sed -n /derghnregnrig/p students.txt

上述 sed 命令都放在一个 shell 脚本文件中,运行时应该在一个文本文件(students.txt)上输出其(累积?)效果

到目前为止,我尝试查找执行此操作的正确步骤,但结果却一团糟。有人能以初学者的耐心清晰地解释一下多个 sed 命令以及任何命令(awk、grep 等)如何放入单个 shell 脚本文件中吗?

使用 Ubuntu 16.04,Vim。Bash shell

答案1

我假设您实际上想看到带有 DOGGGG 的行,因为您正在编辑它(否则,何必呢?)

使用 { } 将命令分组到一个块中...

sed -n '{
       1d
       $d
       /^$/d
       s/dog/DOGGGG/g
       /DOGGGG/p
       /JamesBrady/p
       /derghnregnrig/p
}' students.txt

结果:

  DOGGGG DOGGGG DOGGGG Jamesb
  JamesBrady
  derghnregnrig

你的例子不需要所有这些......

sed -n '{
       1d
       $d
       s/dog/DOGGGG/g;p
}' students.txt

但我猜你的真实文件中间确实有空行和你不想打印的东西。

答案2

首先,检查那些 sed 命令,它们可能没有执行您想要的操作。例如,第二个命令,而不是

sed -n s/dog/DOGGGG/g students.txt

我认为应该

sed -i 's/dog/DOGGGG/g' students.txt

在创建脚本之前,请阅读man sed并确保它们可以单独工作。

创建一个新文件(即 nano yourscript.sh)并写入#!/bin/bashsed 命令,将其替换为students.txt$1$1代表调用脚本时的第一个参数:

#!/bin/bash
sed -e '1d' -e '$d' -e '/^$/d' $1
sed -n s/dog/DOGGGG/g $1
sed -n /JamesBrady/p $1
sed -n /derghnregnrig/p $1

使用正确的 sed 命令。现在授予脚本执行权限:

sudo chmod 755 yourscript.sh

并执行它,以文件名作为第一个参数:

sudo ./yourscript.sh students.txt

如果您的用户没有权限更改 students.txt,那么您只需要在最后一个命令中使用 sudo。

答案3

选项 1:将sedshell 脚本中的每个命令放在单独的行上,并使用-我转变。

sed选项 2:在 shell 脚本中使用单个命令行,但使用单独的-e转变。

如果您的表达式是正交的(即,它们不对相同的匹配进行操作),则选项 2 是首选。

相关内容