我有一个大文件(>10000 行),每行包含一个单词,每个单词后面有一个换行符。单词中不包含空格。
我想列出(或者更好的是,输出到新文件)任何以数字开头和/或结尾的单词,然后我想从原始文件中删除它们。但我不想删除只包含数字的单词。
例如,如果我有内容
789
hello
1hello
112121hello3323
he11o
hello9
88888
然后字符串1hello
, 112121hello3323
,hello9
将获得输出,然后从文件中删除。
我怎样才能做到这一点?
答案1
GNU grep
grep -vP '^\d+\D|\D\d+$'
产生
789
hello
he11o
88888
答案2
实际编辑源文件并使用丢弃的文件创建一个新文件有点棘手。我会这样做
$ cat file
789
hello
1hello
112121hello3323
he11o
hello9
88888
$ perl -i -lne 'if (/^\d+\D|\D\d+$/) {warn "$_\n"} else {print}' file 2>file_nums
$ cat file
789
hello
he11o
88888
$ cat file_nums
1hello
112121hello3323
hello9
匹配的行在 stderr 上输出,然后重定向到单独的文件。 perl 的-i
标志负责就地保存更改。
一句台词可能更棘手:
perl -i -lne 'print {/^\d+\D|\D\d+$/ ? STDERR : ARGVOUT} $_' file 2>file_nums
答案3
解决方案awk
:
awk '$0!~/.*[[:alpha:]][[:digit:]]+$/ && $0!~/^[[:digit:]]+[[:alpha:]]+/' words.txt
789
hello
he11o
88888