【发布时间】:2019-11-29 11:09:41
【问题描述】:
我目前正在编写一个 bash 脚本,以自动生成正则表达式列表,以获取清理文件的链接列表。目前我正在使用 find/replace 在 kate 上手动完成所有操作,但将其作为脚本会更舒服。由于我对 bash 脚本还很陌生,所以我向您寻求帮助。
网址示例列表:
0: "/suburl0"
1: "/suburl1"
2: "/suburl2"
3: "/suburl3"
4: "/suburl4"
我目前拥有的脚本:
#!/bin/bash
awk '[^\x00-\x7F]+' $1 #there are non-ascii chars in the file, so clean it out
awk 'NF' $1 # remove non-character lines
awk '^[0-900]{0,3}: ' $1 #delete all those number infront of the link
awk '"' $1 # remove those quotation marks
awk '!seen[$0]++' $1 #remove duplicate lines
awk '{print "http://example.com/" $0}' $1 #prepend the full url to the suburl
目标是将所有这些正则表达式应用于文件,因此文件最终被清理
我的猜测是,我没有正确重定向 awk 的输出,但是当我尝试将其通过管道传输到文件时,文件只是空行。
【问题讨论】:
-
每个
awk调用都会产生一个修改后的输出,但保持输入文件不变。您有多种解决方案:1)将每个awk调用的输出重定向到一个文件,让下一次调用对该文件进行处理; 2) 将每个awk的输出通过管道传输到以下awk调用中,并且不向它们提供文件输入:它们将使用其标准输入,由前一个输出填充。当然第一个仍然必须以文件为输入,而最后一个的输出可以重定向到一个文件; 3) 使用单个awk调用来执行所有操作。 -
请注意,您的大多数
awk命令也不正确。您可能希望在输入文件上一次测试一个命令并测试它们是否产生预期结果 -
能否在您的问题中发布您的输入和预期输出示例,然后让我们知道,请确保您将示例/代码包装在代码标签中。
-
您的 awk 脚本并没有按照它们旁边的 cmets 的建议执行。
-
@Aaron 当我单独执行它们时,会发生错误 awk '{print [^\x00-\x7F]+/}' testfile ^ 反斜杠不是最后一个字符 正则表达式的语法应该是正确,因为它在 kate 中工作没有问题 RavinderSingh13 正如我提到的输入是上面文件中的行,例如:0:“/suburl0”1:“/suburl1”输出应该是:example.com/suburl0example.com/suburl1Arkku正如我提到的,我对 shell 脚本相当陌生。在凯特作品中手动执行这些正则表达式