使用读取的用户提示时,如何在文件列表中删除正确的url行?

问题描述 投票:0回答:2
file
www.file.com
www.file2.com
www.file3.com 

test.sh
    while true; do
    read -p "Would you like to remove '${url##*/}' from the list? " yn
         case $yn in
         [Yy]* ) echo "Removing '${url##*/}' From File List";
                 sed -i '/[$url]/d' file;  break;;
         [Nn]* ) echo "Leaving '${url##*/}' From File List"; exit;;
             * ) echo "Please answer yes or no.";;
         esac
    done

因此,在运行此脚本时,它应读取每行以删除或保留文件列表中的每一行,并在每行提示是或否的情况下,但在删除时,请删除右行/ URL。现在,我的脚本删除了文件列表中的所有行/ URL。

bash while-loop user-input prompt
2个回答
0
投票

如果要添加到file2中,则出现在file中但不在file2中的行,则可以使用comm(通用)。此bash实用程序用于逐行比较两个排序的文件

使用comm -23,可以识别出在第一文件中存在而在第二文件中不存在的行。

comm -23 <(sort file) <(sort file2) >> file2

这里,filefile2被排序并作为comm的输入。然后,将file中唯一存在的行写入file2

注意:comm仅适用于已排序的输入。

参考:https://ss64.com/bash/comm.html


0
投票

[当前,file2中的每一行必须与file中的当前行匹配,以防止将其写入file2。基本上,您需要使用一个标记匹配行的标志来扩展file2循环,如下所示:

while read lineA; do
  found=false
  while read lineB; do
    if [[ ${lineA##*/} == ${lineB##*/} ]]; then
      printf "${lineA##*/} and ${lineB##*/} match\n"
      found=true
    else
      printf "${lineA##*/} and ${lineB##*/} don't match\n"
    fi
  done < file2
  if [[ "$found" == "false" ]]; then
    printf "$lineA\n" >> file2 # Add Line if Not in file2
  fi
done < file
© www.soinside.com 2019 - 2024. All rights reserved.