2017-10-16 146 views
0

使用wget,网页将作为.txt文件下载。保存的这个文件使用网页的一部分url命名,例如。 wget http://www.example.com/page/12345/ -O 12345.txt,为了方便起见。在txt文件中使用sed查找ID并使用ID来重命名文件

我正在从shell脚本.sh文件运行命令,因为它可以执行多个命令,一次一行,例如。

下载文件后,我使用sed来解析我想保留的文本/字符。我想要的部分文字包括blah blah Product ID a5678

我想要的是使用sed来查找a5678并使用它将文件12345.txt重命名为a5678.txt。

# script.sh 
wget http://www.example.com/page/12345/ -O 12345.txt 
sed -i '' 's/pattern/replace/g' 12345.txt 
sed command to find a5678 # in line blah blah Product ID a5678 
some more sed commands 
mv 12345.txt a5678.txt (or use a variable $var.txt)? 

我该怎么做?

我也可能想使用相同的ID a5678并创建一个同名文件夹a5678。因此.txt文件位于文件夹内,如/a5678/a5678.txt

mkdir a5678 (or mkdir $var)? && cd a5678 

我已经搜索了半天的答案,但找不到任何答案。我发现最近的是 Find instance of word in files and change it to the filename,但它与我想要的完全相反。我也想过使用变量例如。 https://askubuntu.com/questions/76808/how-do-i-use-variables-in-a-sed-command但我不知道如何将找到的字符保存为变量。

非常期待一些帮助!谢谢!我在运行Sierra的Mac上。

+0

除非你是在文件_replacing_角色,我可能只是使用'grep'代替,切割的结果,以提取我需要重新命名弦。或者切换到Perl ... – jdv

回答

1

试图最小化,所以适合你的逻辑。

in=12345.txt 
out=$(grep ' Product ID ' $in | sed 's/.* Product ID \([^ ]*\) .*/\1/') 
mkdir -p $out 
mv $in $out/$out.txt 
+1

我可能会建议几个mod:在grep中添加一个'-m 1'标记(以防止多个匹配),并添加一个'if [$ out];然后是'mkdir'和'mv'命令的''子句,所以如果找不到字符串,就不会有奇怪的行为。 – HardcoreHenry

0

谢谢大家!随着你的灵感,我解决我的问题通过(不使用grep的):

in=12345 
out=$(sed -n '/pattern/ s/.*ID *//p' $in.txt) 
mv $in.txt $out.txt 
cd .. 
mv $in $out 
+0

我想我终于想出了'-n' - '/ p'组合,哈哈。谢谢。 :) –