我有一个 file.txt 文件的每一行都是这样的:
ABLED EY B AH L D
ABLER EY B AH L ER
我想要每行的第二部分:EY B AH L D
或者EY B AH L ER
,例如,小写,其余部分保持大写。我该怎么做?
非常感谢您提前。
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
它可以通过 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 合成器感到厌恶 ;-)。
如果你知道你的文件在阅读和使用 bash 时不会改变:
paste -d " " <(cut -d " " -f 1 your_file) <(cut -d " " -f 2- your_file | tr "[:upper:]" "[:lower:]")
如果您想要一个使用管道的解决方案(不是粘贴解决方案)并且比 sed 解决方案更容易理解,这是一个使用 awk 的解决方案:
awk -F "[ ]" '{str=$1;$1="";print str tolower($0)}' your_file
字段分隔符不能简单地" "
作为连续空格在这种情况下被视为单个分隔符。
即使您希望它在 Linux 平台上运行,也请在脚本的开头使用 #!/bin/ksh。这个 ksh 接受我们在 HpUx 或 Solaris 中使用的所有类型的排版变量。
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