本质上,我得到了一个文本文件,并应该通过 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/bash
sed 命令,将其替换为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:将sed
shell 脚本中的每个命令放在单独的行上,并使用-我转变。
sed
选项 2:在 shell 脚本中使用单个命令行,但使用单独的-e转变。
如果您的表达式是正交的(即,它们不对相同的匹配进行操作),则选项 2 是首选。