我需要猫一个文件和编辑带有多个域名的单行。删除任何域名,有一个特定的模式,4个字母,例如: ozar。
这将在bash脚本中使用,因此域名的数量可以在范围内,稍后我会将其保存到csv中,但现在返回一个字符串是可以的。
我尝试了多个命令、循环和if语句--但是将输出发送给变量--我可以在脚本中进一步使用--这是另一个困难的任务。
$ echo file.txt
ozarkzshared.com win.ad.win.edu win_fl.ozarkzsp.com ap.allk.org allk.org >ozarkz.com website.com
domains_1=$(cat /tmp/file.txt \ sed 's/ozar*//g')
"${string##*ozar}") (domains_2=$ /tmp/file.txt \ printf‘'%s’)
回波domain_x
win.ad.win.edu ap.allk.org allk.org website.com
发布于 2019-11-21 21:54:13
如果所有域都位于由空格分隔的一行上,则这可能有效:
awk '/ozar/ {next} 1' RS=" " file.txt这将设置记录分隔符RS,然后跳过与关键字匹配的任何记录。如果希望能够跳过shell变量中提供的子字符串,可以执行以下操作:
$ s=ozar
$ awk -v re="$s" '$0 ~ re {next} 1' RS=" " file.txt注意,~运算符正在比较正则表达式,而不是精确地比较子字符串。如果您真的想检查子字符串,可以利用index()函数:
$ awk -v s="$s" 'index($0,s) {next} 1' RS=" " file.txt请注意,以上所有内容都是awk,这不是您所要求的。如果您想单独使用bash来完成此操作,那么下面的内容可能适合您:
while read -r -a a; do
for i in "${a[@]}"; do
[[ "$i" = *"$s"* ]] || echo "$i"
done
done < file.txt这将为数组$a[]分配每一行输入,然后逐步完成对子字符串匹配的数组测试,如果没有匹配,则打印。bash中的文本处理效率比awk或sed等更专业的工具低得多。YMMV
发布于 2019-11-21 21:33:59
要删除这些单词,直到空格分隔符。
$ sed 's/ozar[^ ]*//g' file
win.ad.win.edu win_fl. ap.allk.org allk.org website.comhttps://stackoverflow.com/questions/58984002
复制相似问题