我正在编写一个shell脚本,在某些时候必须获取一个文件,在其中搜索特定的单词并删除该单词后面的整个文本(包括单词本身) - awk是正确的工具我想,但我对它的编程知之甚少。
有人可以帮助我吗?
答案 0 :(得分:8)
我认为'awk'是这项工作的一个工具,不过我认为'sed'对于这项特殊操作来说更简单。规范有点模糊。简单的版本是:
为此,我使用'sed':
sed '/word/,$d' file
更复杂的版本是:
我可能仍然使用'sed':
sed -n '1,/word/{s/word.*//;p}' file
这颠倒了逻辑。默认情况下它不会打印任何内容,但是对于第1行,直到第一行包含单词,它会替换(在包含单词的行之前没有任何作用),然后打印。
可以用'awk'完成吗?并非完全无足轻重,因为'awk'自动将输入行输入到单词中,并且因为你必须使用函数来进行替换。
awk '/word/ { if (found == 0) {
# First line with word
sub("word.*", "")
print $0;
found = 1
}
}
{ if (found == 0) print $0; }' file
(已编辑:将'删除'更改为'找到',因为'删除'是'awk'中的保留字。)
在所有这些示例中,输入文件的截断版本将写入标准输出。要在原位修改文件,您需要使用Perl或Python或类似语言,或者将输出捕获到临时文件中,一旦命令完成,您将复制原始文件。 (如果您尝试'脚本文件',则处理空文件。)
可以将各种早期退出优化应用于sed和awk脚本,例如:
sed '/word/q' file
并且,如果您假设使用awk或sed的GNU版本,则可以使用各种非标准扩展来帮助对文件进行原位修改。
答案 1 :(得分:1)
我假设您的输入是这样的:
Lorem ipsum dolor sit amet,
consectetur adipiscing velit。
Nullam neque sapien,molestie vel congue non,
feugiat quis tellus。 Ut quis
nulla mi。 Maecenas一个ligula。
并且您希望输出在单词'vel'
处被截断,如下所示:
Lorem ipsum dolor sit amet,
consectetur adipiscing velit。
Nullam neque sapien,molestie
在这种情况下,您的awk脚本将是:
cat lorem.txt | awk '
/\<vel\>/
{
print substr($0, 0, match($0, /\<vel\>/) - 1);
exit;
}
{ print }
'
您想要切断的单词需要替换脚本中单词vel
的两个实例。
您也可以安全地将整个脚本放在一行上。
答案 2 :(得分:1)
awk '/word/{exit}1' file
答案 3 :(得分:0)
我不确定如何使用awk,但你可以使用sed:
sed -i~ -e 's/the-word-to-find.*$//' the-file
这将删除包含the-word-to-find
的每一行的the-word-to-find
到行尾的所有内容。如果要在第一次出现the-word-to-find
时删除文件的其余部分,则可以执行以下操作:
sed -i~ -e 's/\(the-word-to-find\).*$/\1/;/the-word-to-find/,$d'
答案 4 :(得分:0)
这个awk单行应该可以解决问题: {sub(/ word。* /,“”);打印} 对于每一行,如果该行包含以word开头的模式(以空格开头)并转到该行的末尾 - 将该模式替换为空字符串 - 则打印更新的行。
[想想问题可以读取任何一种方式(该行的全文或文件中的整个文本)。如果想跳过文件的其余部分,可以:{skip = gsub(/ word。* /,“”);打印; if(skip)exit}]
答案 5 :(得分:0)
使用sed删除部分行,例如:
$ echo '12345 John Smith / red black or blue it is a test' | sed -e 's/\/.*//'
$ 12345 John Smith