命令tr上下提取

时间:2018-01-24 07:30:50

标签: linux uppercase lowercase tr

如果我想在-字符之后转换文本部分 我可以使用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

你能帮助我吗?

谢谢

2 个答案:

答案 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 用法:

如果您确定每行的第二部分只有trH,并且它们没有出现在第一部分,那么您可以想象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评估为真时,它会打印出来。“