2017-03-10 29 views
0

我试图自动化一个程序,其中系统将获取文件的内容(每行1个Url),使用wget从文件中抓取文件该网站(https文件夹),然后从该文件中删除该行。Bash:从文件解析Url,处理它们,然后将它们从文件中删除

我已经做了几次尝试,但sed部分(最后)无法理解字符串(我尝试转义字符)并将其从该文件中删除!

cat File 
https://something.net/xxx/data/Folder1/ 
https://something.net/xxx/data/Folder2/ 
https://something.net/xxx/data/Folder3/ 

我的代码行是:提前

cat File | xargs -n1 -I @ bash -c 'wget -r -nd -l 1 -c -A rar,zip,7z,txt,jpg,iso,sfv,md5,pdf --no-parent --restrict-file-names=nocontrol --user=test --password=pass --no-check-certificate "@" -P /mnt/USB/ && sed -e 's|@||g' File' 

它的工作原理,直到sed -e 's|@||g' File部分..

谢谢!

+0

如果你要读整个文件,为什么一行删除内容系?你不能只是'data = $(cat File);回声-n>文件? – Aaron

+0

对于更高级的情况,您可能需要考虑使用'flock'。 – Aaron

回答

1

@beliy答案看起来不错!

如果你想要一个班轮,你可以这样做:

while read -r line; do \ 
wget -r -nd -l 1 -c -A rar,zip,7z,txt,jpg,iso,sfv,md5,pdf \ 
--no-parent --restrict-file-names=nocontrol --user=test \ 
--password=pass --no-check-certificate "$line" -P /mnt/USB/ \ 
&& sed -i -e '\|'"$line"'|d' "File.txt"; \ 
done < File.txt 

编辑: You need to add a \ in front of the first pipe

+0

感谢您的回复! 之后,它需要一个额外的空间..我运行它,当它试图下载我添加的测试位置(3假和1好),当它到达sed部分我得到: sed:-e表达式#1,字符1:未知命令:'|' – tfonias74

+0

好点,你需要在第一个'|'前面加一个'\'显然,我不知道!谢谢! – jraynal

+0

正确,如果你用sed -i更改'sed -e,这正是我正在搜索的内容;) – tfonias74

1

我相信你只需要在sed -e之后使用双引号。相反的:

'...&& sed -e 's|@||g' File' 

你需要

'...&& sed -e '"'s|@||g'"' File' 
+0

感谢您的回复! 双引号工作(它用于通过一个错误)。 – tfonias74

+0

我正在尝试将其更改为'sed -i'“'| | | d'”''但无法使其运行..您有想法吗? – tfonias74

0

我看你想做什么,但我不明白的sed命令包括管道。也许一些我不明白的奇特格式。

无论如何,我认为sed命令应该是这样的......

sed -e 's/@//g' 

这个命令会从流中删除所有@。
我希望这有助于!

+0

我切换到试图避免网址上出现斜线的管道。 – tfonias74

2

不要使用猫,如果它是可行的。这是不好的做法,可以是大文件的问题......你可以改变

cat File | xargs -n1 -I @ bash -c 

for siteUrl in $(< "File"); do 

这是更正确,更简单的方法是使用双引号...我的变种sed的:

scriptDir=$(dirname -- "$0") 
for siteUrl in $(< "$scriptDir/File.txt") 
do 
    if [[ -z "$siteUrl" ]]; then break; fi # break line if him empty 
    wget -r -nd -l 1 -c -A rar,zip,7z,txt,jpg,iso,sfv,md5,pdf --no-parent --restrict-file-names=nocontrol --user=test --password=pass --no-check-certificate "$siteUrl" -P /mnt/USB/ && sed -i "s|$siteUrl||g" "$scriptDir/File.txt" 
done 
+0

感谢您的回复! 我怎样才能更新文件本身?我用4行测试它(3无效和1有效)。我在屏幕上得到所需的输出(4行之间有一个间隙,有效缺失),但文件保持不变.. – tfonias74

+0

我试图切换到'sed -i“| $ siteUrl | d”'但我得到'sed:-e表达式#1,字符1:未知命令:'|''。 – tfonias74

+0

还有另外一个问题,当URL包含空格时,这段代码将它作为不同的元素刹车。 – tfonias74

相关问题