[英]Replacing characters in each line on a file in linux
我有一个文件,每行都有不同的单词。 我的目标是将第一个字符替换为大写字母,并将第三个字符替换为“#”。
例如: football
将交换为Foo#ball
。
我尝试考虑使用 awk 和 sed。这对我没有帮助,因为(据我所知)sed 需要精确的字符输入,而 awk 可以打印所需的字符但不能更改它。
使用 GNU sed 和两个s
命令:
echo 'football' | sed -E 's/(.)/\U\1/; s/(...)./\1#/'
输出:
Foo#ball
请参阅: 3.3 s 命令、 5.7 反向引用和子表达式以及5.9.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
虽然 shell 通常较慢,但当使用仅限于内置时,它不会落后太多。
(注意:您的问题是第 3 个字符,但您的示例将第 4 个字符替换为'#'
)
这可能对您有用(GNU sed):
sed 's/\(...\)./\u\1#/' file
Cyrus 或 Potong 的答案是首选答案。 (对于 Linux 或具有 GNU sed 的系统,因为 \U 或 \u。)
这只是 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。
使用 GNU awk 将第三个参数匹配():
$ echo 'football' | awk 'match($0,/(.)(..).(.*)/,a){$0=toupper(a[1]) a[2] "#" a[3]} 1'
Foo#ball
这应该适用于任何版本的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#
如果您的数据在“d”文件中,请在 gnu sed 上尝试:
sed -E 's/^(\w)(\w\w)\w/\U\1\E\2#/' d
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.