所以我有一个包含此内容的1.txt文件
1.1.1.1/0 2.2.2.2/0 9.9.9.9/0
我想将它们附加到2.txt文件中,就像这样:
......
1.1.1.1/0
2.2.2.2/0
9.9.9.9/0
我应该怎么做?
答案 0 :(得分:3)
执行此操作的简单方法是使用 command-substitution 将{em>重定向 file1
到printf "%s\n"
,然后将结果返回到file2
。例如,给定:
$ cat file1.txt
1.1.1.1/0 2.2.2.2/0 9.9.9.9/0
您可以使用单个file2.txt
创建您想要的>
(截断/创建新的file2.txt
)以重定向输出到file2.txt
,但是如果您要按照问题中的说明附加到file2.txt
的原始内容,请使用>>
,例如:>
$ printf "%s\n" $(<file1.txt) >>file2.txt
将以下内容附加到您的file2.txt
:
$ cat file2.txt
## original content
1.1.1.1/0
2.2.2.2/0
9.9.9.9/0
(这通常称为 printf-trick ,其中printf "%s\n"
将依靠分词来将列表分成与列表中一样多的由换行符分隔的单个单词。它具有还有很多其他用途。请警惕,如果您的行数多于shell可以作为参数容纳的行数(如果我没记错的话,这是32767,则可能无效)
另一种更标准的方法是使用tr
将spaces
翻译成'\n'
,例如
$ tr ' ' '\n' < file1.txt >> file2.txt
将完成相同的操作。另请注意,您可以使用 character class (例如' '
)来代替单个空格使用[...]
,bash提供POSIX标准字符类,例如{{ 1}}(有关完整列表,请参见alnum alpha ascii blank ...
),可以在 character class 中使用,例如man bash
来检查所有空白字符([:blank:]
,等。)而不仅仅是空间。例如:
space tab newline
(关于创建/附加$ tr '[:blank:]' '\n' < file1.txt >> file2.txt
的相同注释)
您还可以使用>/>>
来完成相同的操作,例如
sed
$ sed 's/[ ]/\n/g' file1.txt >> file2.txt
的好处是,您可以控制地址之间任意数量空格的替换。例如,如果地址之间有一些可变数量的空格或制表符,则可以使用sed
处理以下问题:
sed
尝试一下,知道$ sed 's/[ \t][ \t]*/\n/g' file1.txt >> file2.txt
和tr
是更强大的解决方案,但是 printf-trick 也可以派上用场。