使用sed用下划线替换字母[a-z],[A-Z]和[']

时间:2019-06-19 19:44:30

标签: regex sed

...适用于除第一个单词以外的一行中每个单词的首字母以外的所有字符。所有文字均为英语。

想使用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的风格。

3 个答案:

答案 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___

我很喜欢这项任务。