如果我想在-
字符之后转换文本部分
我可以使用tr
命令吗?
使用此命令在所有文本上应用该功能
cat file.txt | tr [: upper:] [: lower:]
01103I-GG102
01103I-GG102
01103I-GG102
01103I-GG102
01103I-HH'2
01103I-HH'2
01103I-HH'2
01103I-HH'2
01103I-HH'2
01103I-HH'2
01103I-HH'2
01103I-HH'2
01103I-HH'3
01103I-HH'12
01103I-HH'12
01103I-HH'12
01103I-HH'12
01103I-HH'12
01103I-HH'12
01103I-HH'12
01103I-HH'22
01103I-HH'22
01103I-HH'22
01103I-HH'42
01103I-HH'42
01103I-HH'42
01103I-HH'42
01103I-HH'42
01103I-HH'42
01103I-HH'43
01103I-GG62
01103I-GG62
01103I-GG62
01103I-GG62
01103I-GG62
01103I-GG62
01103I-GG62
01103I-GG62
01103I-GG63
01103I-GG63
01103I-GG63
01103I-GG63
01103I-GG63
01103I-GG63
01103I-GG63
01103I-GG52
你能帮助我吗?
谢谢
答案 0 :(得分:1)
如果我是你,我会选择sed
解决方案。以下sed命令确实会根据帖子中的请求转换输入文件(在-
之后为小写)
$ sed 's/\(.*\)-\(.*\)/\1-\L\2/g' file
01103I-gg102
01103I-gg102
01103I-gg102
01103I-gg102
01103I-hh'2
01103I-hh'2
01103I-hh'2
01103I-hh'2
01103I-hh'2
01103I-hh'2
01103I-hh'2
01103I-hh'2
01103I-hh'3
01103I-hh'12
01103I-hh'12
01103I-hh'12
01103I-hh'12
01103I-hh'12
01103I-hh'12
01103I-hh'12
01103I-hh'22
01103I-hh'22
01103I-hh'22
01103I-hh'42
01103I-hh'42
01103I-hh'42
01103I-hh'42
01103I-hh'42
01103I-hh'42
01103I-hh'43
01103I-gg62
01103I-gg62
01103I-gg62
01103I-gg62
01103I-gg62
01103I-gg62
01103I-gg62
01103I-gg62
01103I-gg63
01103I-gg63
01103I-gg63
01103I-gg63
01103I-gg63
01103I-gg63
01103I-gg63
01103I-gg52
<强>说明:强>
s/\(.*\)-\(.*\)/\1-\L\2/g
你在替换模式中使用sed并捕获-
周围的2个组,然后使用后引用作为替换,并将第二组转换为小写(包含{后面的模式{1}})使用-
选项。 \L
用法:
如果您确定每行的第二部分只有tr
和H
,并且它们没有出现在第一部分,那么您可以想象G
之类的内容但这是这个小tr 'HG...' 'hg...'
命令可以做的最大值。
答案 1 :(得分:1)
@ Allan的Url
解决方案更好,但为了多样化,这是另一种方法。
第一个sed
内的部分提取破折号前的部分。第二个<(...)
内的部分提取破折号后的部分,并使用<(...)
进行转换。然后tr
重新组合这两部分:
paste
请注意,此技术是“bashism”,因此您需要使用paste -d- <(cut -f1 -d- file.txt) <(cut -d- -f2 file.txt | tr [:upper:] [:lower:])
shell。
对于更多种类,您也可以使用bash
:
awk
多数民众赞成说...... “使用短划线(awk -F- '{$2=tolower($2)} 1' OFS=- file.txt
)作为字段分隔符。将字段2中的字母更改为小写。打印结果 - 因为-
的默认操作如果符合条件则打印,当awk
评估为真时,它会打印出来。“