我有一个巨大的文件,我想在@
短于特定阈值的每一行前面添加一个字符。
例如,假设我们有以下文件
dddd
weowfpdvkdfpomcwdf[wedifkw[efkwcwfpmcsdlvcdvdvdfvbdffvd
13148-089-42094vj2-393-8-08923r234234r232
ssss
wvmigmfogvjjtgoprgfbkpgofkbgpfbokdfvdd
13012323432432-123421343-343432323-2322
我想修改所有长度为 10 个字符或更少的行。那么输出应该是:
@dddd
weowfpdvkdfpomcwdf[wedifkw[efkwcwfpmcsdlvcdvdvdfvbdffvd
13148-089-42094vj2-393-8-08923r234234r232
@ssss
wvmigmfogvjjtgoprgfbkpgofkbgpfbokdfvdd
13012323432432-123421343-343432323-2322
答案1
假设您的阈值是“10 个或更少字符”,您可以使用
sed '/^.\{1,10\}$/s/^/@/' input.txt
这将使用地址说明符/^.\{1,10\}$/
仅处理包含 1 到 10 个字符的行,然后将“行开头”“替换”为@
。
或者,正如@terdon 所指出的:
sed 's/^\{1,10\}$/@&/' input.txt
这会将任何包含 1 到 10 个字符的行替换为@
,后跟“本身”( &
)。这种方法可能(稍微)更快,因为它只涉及一个正则表达式来处理。
您还可以使用awk
:
awk 'length($0)<=10 {printf "@"}1' input.txt
这将按原样打印大多数行,但在那些小于或等于 10 个字符的行上,@
首先打印 a。
答案2
您可以使用sed
:
# the threshold is the '5'
$ sed '/^.\{1,5\}$/s/^/@/' file
@dddd
weowfpdvkdfpomcwdf[wedifkw[efkwcwfpmcsdlvcdvdvdfvbdffvd
13148-089-42094vj2-393-8-08923r234234r232
@ssss
wvmigmfogvjjtgoprgfbkpgofkbgpfbokdfvdd
13012323432432-123421343-343432323-2322
答案3
使用awk我们可以执行的实用程序如下所示:
awk '/.{10}./||($0="@"$0)' file
流编辑器sed同样可以这样做:
sed -e '
s/./&/11;t
s/^/@/
' file
- 触发前缀的阈值是 10 个字符或更少。