Bash 脚本:按行编辑 .txt

Bash Script : Edit .txt by Line

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

VALUE1[SPACE]VALUE2

现在我必须获取另一个(或相同的)文件,其中包含一个新列表,例如:

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

...列表中的每一行都包含这两个值。我该怎么做?

我假设 VALUE1VALUE2 不包含 space,否则第一个定义会变得不明确。有了这个假设,您可以在第一个 space 使用 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

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

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

这将用 space 拆分每一行,替换第一个标记 </code> 中的左括号并替换第二个标记 <code> 中的右括号,然后使用值它们各自的标记 </code> 和 <code> 在您使用 print

输出的字符串中

您的输入数据文件的格式是(VALUE1 VALUE2).。你先去掉开头的(,后面的). 有很多方法可以做到这一点,这里是一个

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

然后您可以将其传递给 awk。这里</code>对应第一列,<code>对应第二列:

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

我会为此使用 sed

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

如果您愿意,可以通过添加 -i.bak 就地修改原始文件:sed -i.bak $'s,...,'.