Linux 将带有awk命令的bash脚本应用于文件

Linux 将带有awk命令的bash脚本应用于文件,linux,bash,shell,unix,awk,Linux,Bash,Shell,Unix,Awk,我目前正在编写一个bash脚本,以自动生成一个regex列表,从而生成一个链接列表来清理文件。目前,我正在使用find/replace在kate上手动执行所有操作,但将其作为脚本使用会更舒服。因为我对bash脚本编写还比较陌生,所以我向您寻求帮助 URL的示例列表: 0: "/suburl0" ​ 1: "/suburl1" ​ 2: "/suburl2" ​ 3: "/suburl3" ​ 4: "/suburl4" 目前我有: #!/bin/bash awk '[^\x00-\x7F]+'

我目前正在编写一个bash脚本,以自动生成一个regex列表,从而生成一个链接列表来清理文件。目前,我正在使用find/replace在kate上手动执行所有操作,但将其作为脚本使用会更舒服。因为我对bash脚本编写还比较陌生,所以我向您寻求帮助

URL的示例列表:

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:

cat $1 \
        | tr -cd '[:print:][:space:]' \
        | grep . \
        | sed -r 's/^[0-9]{1,3}: //' \
        | tr -d '"' \
        | sort -u \
        | awk '{print "http://example.com" $0}'
请注意,
sort
将更改顺序,我假设顺序无关紧要

还要注意,
sed-r
是GNU

略为简化且更便于携带的版本:

cat $1 \
        | tr -cd '[:graph:]\n' \
        | grep . \
        | tr -d '"' \
        | sort -u \
        | sed 's,^[0-9]*:,http://example.com,'
输出:

http://example.com/suburl0
http://example.com/suburl1
http://example.com/suburl2
http://example.com/suburl3
http://example.com/suburl4

每个
awk
调用都会生成一个修改后的输出,但输入文件保持不变。您有多种解决方案:1)将每个
awk
调用的输出重定向到一个文件,让下一个调用处理该文件;2) 将每个
awk
的输出导入到以下
awk
调用中,并且不向它们提供文件输入:它们将处理由前一个输出填充的标准输入。当然,第一个仍然必须将文件作为输入,最后一个的输出可以重定向到文件;3) 使用将执行所有操作的单个
awk
调用。请注意,大多数
awk
命令也不正确。您可能希望在输入文件上一次测试一个命令,并测试它们是否产生预期结果。请在问题中发布输入和预期输出的示例,然后让我们知道,请确保您正在将示例/代码包装在代码标记中。您的awk脚本不会执行旁边的注释所建议的操作。@Aaron当我单独执行这些操作时,会出现错误awk'{print[^\x00-\x7F]+/}'testfile^反斜杠不是第行的最后一个字符正则表达式的语法应该是正确的,因为它在kate中工作没有问题RavinderingH13,正如我提到的,输入是上面文件中的行,例如:0:“/suburl0”​ 1:“/suburl1”输出应为:​ 正如我所提到的,我对shell脚本相当陌生。在kate works中手动执行这些正则表达式“sed-r是GNU”我建议使用
sed-E
作为替代,它既适用于现代GNU-sed,也适用于BSD-sed,而且它与
grep
的标志一致。它不适用于您希望使用
-r
的较旧GNU-sed版本,而且它也不是POSIX定义的,但在有些现代的系统上,您有更好的机会使用它,而不必知道您为哪个
sed
编码