...适用于除第一个单词以外的一行中每个单词的首字母以外的所有字符。所有文字均为英语。
想使用sed转换这样的输入:
Mary had a little lamb
It's fleece was white as snow
对此:
Mary h__ a l_____ l___
It's f_____ w__ w____ a_ s___
对于关注提示召回的项目。
查看了sed和regex的几个介绍。将在MacOS 10.14.5随附的终端上使用sed的风格。
答案 0 :(得分:2)
这可能对您有用(GNU sed):
sed -E 'h;y/'\''/x/;s/\B./_/g;G;s/\S+\s*(.*)\n(\S+\s*).*/\2\1/' file
在保留空间中复制当前行。将'
转换为`x',以便可以用除每个单词的第一个字母以外的下划线填充此类单词。附加复制的行,并使用分组和反向引用替换该行的第一个单词。
答案 1 :(得分:1)
sed用于对单个字符串全部进行简单的s / old / new操作。对于其他任何事情,您都应该使用awk,例如与GNU awk匹配的第三个参数(
$ awk '{
out = $1
$1 = ""
while ( match($0,/(\S)(\S*)(.*)/,a) ) {
out = out OFS a[1] gensub(/./,"_","g",a[2])
$0 = a[3]
}
print out $0
}' file
Mary h__ a l_____ l___
It's f_____ w__ w____ a_ s___
在每个UNIX盒的任何外壳中都有任何awk,包括MacOS上的默认awk:
$ awk '{
out = $1
$1 = ""
while ( match($0,/[^[:space:]][^[:space:]]*/) ) {
str = substr($0,RSTART+1,RLENGTH-1)
gsub(/./,"_",str)
out = out OFS substr($0,RSTART,1) str
$0 = substr($0,RSTART+RLENGTH)
}
print out $0
}' file
Mary h__ a l_____ l___
It's f_____ w__ w____ a_ s___
答案 2 :(得分:0)
这是另一个awk
脚本(所有awk
版本),我很喜欢为此任务创建。
script.awk
{
for (i = 2; i <= NF; i++) { # for each input word starting from 2nd word
head = substr($i,1,1); # output word head is first letter from current field
tail = substr("____________________________", 1, length($i) - 1); # output word tail is computed from template word
$i = head tail; # recreate current input word from head and tail
}
print; # output the converted line
}
input.txt
Mary had a little lamb
It's fleece was white as snow
运行:
awk -f script.awk input.txt
这也可以压缩为一行:
awk '{for (i = 2; i <= NF; i++) $i = substr($i,1,1) substr("____________________________", 1, length($i) - 1); print }' input.txt
输出为:
Mary h__ a l_____ l____
It's f_____ w__ w____ a_ s___
我很喜欢这项任务。