我想知道如何使用行号从文件中提取内容。我的文件中有几千万行,有时在将其导入某些数据库(如 mongodb)时会出现问题。所以我需要编辑它。但为了编辑一行而一次又一次打开几 GB 的文件是不值得的。
因此,我想知道如何使用行号从文件中提取内容,然后编辑任何我想编辑的内容并将其再次保存到文件中,而无需完全打开文件。举个例子:
command line_number 20000 /path/to/input/file
输出:
This your first testing text.
edit line_number 20000 /path/to/input/file
然后出现该行,然后我移动到特定字符,your
在该行中说并将其更改为my
。现在我在该行上的新内容变成:
This is my first testing text.
请注意,我不知道该行是否有该词。所以,首先我需要检查该行。使用行号显示该行。然后编辑它。
有办法实现吗?
让我澄清一下,我使用的是 UBUNTU 16.04。这个问题完全基于 UBUNTU,没有其他操作系统或 Linux 发行版。请不要这样做。
答案1
您可以使用sed
或perl
打印第 X 行:
$ cat -n input.txt
1 roses are red
2 violets are blue
3 sed is interesting
4 and perl is too
$ perl -ne 'print $_ if $. == 3' input.txt
sed is interesting
$ sed -n '3p' input.txt
sed is interesting
然后你可以使用sed 'NUMBERs/WORD/NEWWORD/' file.txt
$ sed '3s/interesting/fun/' input.txt
roses are red
violets are blue
sed is fun
and perl is too
您-i
也可以使用标志来就地编辑文件。
与 Perl 相同:
$ perl -pe 's/interesting/fun/ if $. == 3' input.txt
roses are red
violets are blue
sed is fun
and perl is too
笔记:通过这两个编辑示例,您无需知道该行是否包含单词。只有当该行包含单词/模式时,perl
和才会替换该单词。如果不包含 - 该行将保持不变。sed
答案2
您可以使用 vi 命令来编辑文件而无需打开它们:
vi -c "%s/<old_value>/<new_value>/g|wq" <file_path>
例如
vi -c "%s/<100>/<200>/g|wq" /home/aditya/sample.txt
更新 1:
sed '<line_number>!d' <filepath> ( this will print the line)
sed -i '<line_number>s/.*/<new_text>/' <filepath> ( this is replace everthing in line with 'new_text')
更新2:
sed -i '<line_number>s/<old_text>/<new_text>/' <filepath> ( this is replace 'old_text' with 'new_text')
看看是否有帮助。