我有一个文件,每行都有不同的单词。 我的目标是将第一个字符替换为大写字母,并将第三个字符替换为“#”。
例如:足球将被交换为-> Foo#ball
我尝试过考虑使用awk和sed。这对我没有帮助,因为(据我所知)sed需要准确的字符输入,而awk可以打印所需的字符但不能更改它。
答案 0 :(得分:4)
使用GNU sed和两个s
命令:
echo 'football' | sed -E 's/(.)/\U\1/; s/(...)./\1#/'
输出:
Foo#ball
请参阅:3.3 The s Command,5.7 Back-references and Subexpressions和5.9.2 Upper/Lower case conversion
答案 1 :(得分:3)
这可能对您有用(GNU sed):
sed 's/\(...\)./\u\1#/' file
答案 2 :(得分:2)
使用bash,您可以单独使用参数扩展来完成任务。例如,如果将每一行读入变量line
,则可以执行以下操作:
line="${line^}" # change football to Football (capitalize 1st char)
line="${line:0:3}#${line:4}" # make 4th character '#'
示例输入文件
$ cat file
football
soccer
baseball
使用/输出示例
$ while read -r line; do line="${line^}"; echo "${line:0:3}#${line:4}"; done < file
Foo#ball
Soc#er
Bas#ball
虽然外壳通常较慢,但仅限于内置使用时,并不会落后太多。
(注意:您的问题是第3个字符,但您的示例用'#'
替换了第4个字符)
答案 3 :(得分:1)
Cyrus或Potong的答案是首选。 (对于Linux或由于\ U或\ u而使用GNU sed的系统。)
这只是awk的附加解决方案,因为您提到了它,并且还使用了awk标签:
$ echo 'football'|awk '{a=substr($0,1,1);b=substr($0,2,2);c=substr($0,5);print toupper(a)b"#"c}'
Foo#ball
这是没有RegEx的最简单解决方案。它也可以在非GNU awk上运行。
答案 4 :(得分:1)
使用GNU awk将第三个参数匹配():
$ echo 'football' | awk 'match($0,/(.)(..).(.*)/,a){$0=toupper(a[1]) a[2] "#" a[3]} 1'
Foo#ball
答案 5 :(得分:0)
这适用于任何版本的awk
:
awk '{
for(i=1;i<=NF;i++){
# Note that string indexes start at 1 in awk !
$i=toupper(substr($i,1,1)) "" substr($i,2,1) "#" substr($i,3)
}
print
}' file
注意:如果一个单词少于3个字符,例如 it
,它将被打印为It#
答案 6 :(得分:0)
如果您的数据位于“ d”文件中,请尝试使用gnu sed:
sed -E 's/^(\w)(\w\w)\w/\U\1\E\2#/' d