我已经看到很多搜索和替换线程的假设是:1。你要么知道你明确要找的是什么字符串或子字符串,要么2.你知道它在字符串中的确切位置或者是3 。 在我的情况下,我有一个包含一列和1M行的csv文件。例如
1,google.com
2,yahoo.com
3,twitter.com
4,xyz.com
对于每一列,我想用http分号dble forward slash 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}
非常感谢你提前
路易斯
答案 0 :(得分: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
答案 1 :(得分:0)
您的脚本已关闭。您可以将cat
的输出直接传递给while
循环,但最好使用输入重定向(< X.csv
)。在IFS=,
之前使用read
会将该行拆分为以逗号分隔的字段,但您只是缺少一个变量来保存第二个字段。
HTTPSTRING="http://www."
while IFS=, read number domain
do
echo "$HTTPSTRING$domain"
done < X.csv
答案 2 :(得分:0)
您只能使用命令,不需要显式的Bash循环:
cut -d',' -f2 < X.csv | sed 's_^_http://www._' > Y.txt
请注意,/
中s
之后使用的常用sed
已替换为_
,因为它包含在要替换的字符串中。 ^
匹配行的开头。