我有一个 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
的方法:
在变量上设置“lowercase”标志(仅适用于KornShell和兼容的shell):
typeset -l second
while read first second; do
printf '%s\t%s\n' "$first" "$second"
done < file.txt
使用Bash的大小写修改参数扩展修饰符(仅适用于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/[^ ]* //
) 将行的第一个空格之前的部分放入保持空间,将第一个空格之后的部分放入模式空间:
h
:将实际行复制到保持空间。s/ .*//
:仅在模式空间中保留第一个空格之前的字符。x
:切换保持和模式空间。s/[^ ]* //
:仅在模式空间中保留第一个空格之后的字符。y/AZERTYUIOPQSDFGHJKLMWXCVBN/azertyuiopqsdfghjklmwxcvbn/
(是的,我有一个 AZERTY 键盘)。H
:将模式空间追加到保持空间。x
:交换模式空间和保持空间。s/\n/ /
:用空格替换H
命令的\n
。希望您不会对sed语法感到厌恶 ;-).
paste -d " " <(cut -d " " -f 1 your_file) <(cut -d " " -f 2- your_file | tr "[:upper:]" "[:lower:]")
awk -F "[ ]" '{str=$1;$1="";print str tolower($0)}' your_file
字段分隔符不能简单地使用" "
,因为在这种情况下,连续的空格被视为单个分隔符。
import sys
for l in sys.stdin.read().splitlines():
try:
head,rest = l.split(' ', 1)
print head, rest.lower()
except: print l
按照以下方式运行它(假设您将脚本保存在名为filter.py
的文件中):
$ python filter.py < file.txt
<<<
是 KornShell 和 Bash 的扩展,在 POSIXsh
中不可用。 - Greg A. Woods