Bash脚本:按行编辑.text

时间:2015-02-23 14:45:13

标签: bash shell ubuntu scripting

我有一个长度未知的文本文件。每行有两个值:

VALUE1[SPACE]VALUE2

现在我必须使用新的List获取另一个(或相同的)文件,如:

0.0.0.0/rep/com/bla/blub/VALUE1/VALUE2/VALUE1-VALUE2.zip

...对于列表中包含两个值的每一行。我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

这是awk的一个很好的用例(更新以处理parantheses):

awk -F" " '{ gsub("\\(", "", $1); gsub("\\)", "", $2);print "0.0.0.0/rep/com/bla/blub/"$1"/"$2"/"$1"-"$2".zip"}' test.txt > yournewfile.txt

这将使用空格分割每一行,替换第一个标记$1中的左括号并替换第二个标记$2中的右括号,然后在各自的标记中使用值{{1您使用$1

输出的字符串中的{}和$2

答案 1 :(得分:0)

我假设VALUE1VALUE2不包含空格,否则第一个定义变得模糊。使用此假设,您可以使用cut在第一个空格处拆分一行,并使用字符串插值组合filename变量:

cat txt-File | while read VALUE1 VALUE2 _; do
    filename="0.0.0.0/rep/com/bla/blub/$VALUE1/$VALUE2/$VALUE1-$VALUE2.zip"

    # Do something with filename...
    stat "$filename"
done

答案 2 :(得分:0)

输入数据文件的格式为(VALUE1 VALUE2).。您首先删除了初始(,后者).有很多方法可以做到这一点,这里有一个

sed 's/(//g' yourfile | sed 's/).//g' 

然后您可以将其传递给awk。此处$1对应第一列,$2对应第二列:

sed 's/(//g' yourfile | sed 's/).//g' | awk '{print "0.0.0.0/rep/com/bla/blub/"$1"/"$2"/"$1"-"$2".zip"}'

答案 3 :(得分:0)

我会使用sed

sed $'s,^[ \t]*\([^ \t]*\)[ \t][ \t]*\([^ \t]*\).*$,0.0.0.0/rep/com/bla/blub/\1/\2/\1-\2.zip,' filename >new-filename

如果您愿意,可以添加-i.baksed -i.bak $'s, ... ,'来修改原始文件。