将字符串添加到所有短于阈值的行

将字符串添加到所有短于阈值的行

我有一个巨大的文件,我想在@短于特定阈值的每一行前面添加一个字符。

例如,假设我们有以下文件

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 个字符或更少。

相关内容