4

我有一个 file.txt 文件的每一行都是这样的:

ABLED   EY B AH L D
ABLER   EY B AH L ER

我想要每行的第二部分:EY B AH L D或者EY B AH L ER,例如,小写,其余部分保持大写。我该怎么做?

非常感谢您提前。

4

6 回答 6

8
while read first second; do
    second=$(echo "$second" | tr [:upper:] [:lower:])
    printf '%s\t%s\n' "$first" "$second"
done < file.txt

输出:

ABLED   ey b ah l d
ABLER   ey b ah l er

无需调用即可在 KornShell、pdksh 或 Bash 中执行此操作的另外两种方法tr

在变量上设置“小写”标志(仅限 KornShell 和兼容的 shell):

typeset -l second
while read first second; do
    printf '%s\t%s\n' "$first" "$second"
done < file.txt

使用 Bash 的 case-modification 参数扩展修饰符(仅限 Bash!):

while read first second; do
    printf '%s\t%s\n' "$first" "${second,,}"
done < file.txt
于 2012-12-18T14:50:14.807 回答
1

它可以通过 sed 使用以下令人难以置信的混淆脚本来完成:

sed -e 'h;s/ .*//;x;s/[^ ]* //;y/AZERTYUIOPQSDFGHJKLMWXCVBN/azertyuiopqsdfghjklmwxcvbn/;H;x;s/\n/ /' your_file

解释

脚本的第一部分 ( h;s/ .*//;x;s/[^ ]* //) 将 a 部分放在保持空间中第一个空格之前的行,并将该行的部分放在模式空间中的第一个空格之后:

  • h:复制保留空间中的实际行。
  • s/ .*//: 在模式空间中只保留第一个空格之前的字符。
  • x:切换保持和模式空间。
  • s/[^ ]* //: 在模式空间中只保留第一个空格之后的字符。

好的,现在我们在保持空间中有行的第 1 部分,在模式空间中有第 2 部分。我们需要将第二部分小写,所以我们使用y/AZERTYUIOPQSDFGHJKLMWXCVBN/azertyuiopqsdfghjklmwxcvbn/(是的,我有一个 AZERTY 键盘)。

然后,只需将文件的第一部分和第二部分一起取回:

  • H: 追加模式空间以保持空间。
  • x:交换模式空间和保持空间。
  • s/\n/ /:用空格替换命令\n的。H

我希望你不会对 sed 合成器感到厌恶 ;-)。

于 2012-12-18T19:15:56.467 回答
0

如果你知道你的文件在阅读和使用 bash 时不会改变:

paste -d " " <(cut -d " " -f 1 your_file) <(cut -d " " -f 2- your_file | tr "[:upper:]" "[:lower:]")
于 2012-12-18T19:23:54.937 回答
0

如果您想要一个使用管道的解决方案(不是粘贴解决方案)并且比 sed 解决方案更容易理解,这是一个使用 awk 的解决方案:

awk -F "[ ]" '{str=$1;$1="";print str tolower($0)}' your_file

字段分隔符不能简单地" "作为连续空格在这种情况下被视为单个分隔符。

于 2012-12-18T19:34:52.123 回答
0

即使您希望它在 Linux 平台上运行,也请在脚本的开头使用 #!/bin/ksh。这个 ksh 接受我们在 HpUx 或 Solaris 中使用的所有类型的排版变量。

于 2013-04-11T11:02:30.867 回答
-1

A Python script:

import sys
for l in sys.stdin.read().splitlines():
    try:
        head,rest = l.split(' ', 1)
        print head, rest.lower()
    except: print l

Run it like this (assuming you save the script in a file called filter.py):

$ python filter.py < file.txt
于 2012-12-18T14:58:03.567 回答