1

我已经看到许多基于以下假设的搜索和替换线程:1. 您要么知道要明确查找的字符串或子字符串,要么 2. 您知道它在字符串中的确切位置,或者 3. 两者结合。在我的情况下,我有一个包含一列和 1M 行的 csv 文件。例如

1,google.com
2,yahoo.com
3,twitter.com
4,xyz.com

对于每一列,我想用 http 分号 dble 正斜杠 dubdubdub替换每个字符(递增的整数)直到并包括逗号

到目前为止,我有以下

HTTPSTRING="http://www."
cat X.csv << Will this ensure that the while block is executed on this file?
while IFS=, read line
  do {$line/(.*?),/HTTPSTRING} << This is where I am having trouble
done
exit 0

我想要一个每行包含一个 URL 的文本文件,例如

http://www.google.com
...
http://www.${999,999_more_urls} 

非常感谢你提前

刘易斯

4

3 回答 3

1

这是一个贪婪的匹配,如果你有任何逗号而不是分隔初始整数和你想要保留的字符的逗号,这将是一个问题。但它适用于您的示例 X.csv 文件,生成符合您的输出规范的 Y.csv 文件。

HTTPSTRING="http://www."
while read line
do
  echo ${line/*,/$HTTPSTRING}
done < X.csv > Y.csv
exit 0

对于它的价值,如果你把它放在一个脚本中,你可以从代码本身中取出文件输入/输入重定向部分,而不是在调用脚本时应用它们。

如果您不严格限于 bash 本身,您可能需要考虑使用 sed。这些中的任何一个都应该做你想做的事,只是你喜欢转义字符串中的斜杠还是使用非标准分隔符:

sed 's/[0-9]*,/http:\/\/www./' X.csv > Y.csv
sed 's~[0-9]*,~http://www.~' X.csv > Y.csv
于 2013-02-23T04:32:56.263 回答
0

你的脚本很接近。您可以将 的输出cat直接传送到while循环,但最好使用输入重定向 ( < X.csv)。使用IFS=,beforeread会将行拆分为用逗号分隔的字段,但您只是缺少一个变量来保存第二个字段。

HTTPSTRING="http://www."
while IFS=, read number domain
do 
    echo "$HTTPSTRING$domain"
done < X.csv
于 2013-02-23T05:47:20.260 回答
0

您只能使用命令,不需要显式 Bash 循环:

cut -d',' -f2 < X.csv | sed 's_^_http://www._' > Y.txt

请注意,在 in 之后使用的通常被/替换为,因为它包含在要替换的字符串中。匹配行的开头。ssed_^

于 2013-02-24T08:51:23.983 回答