我有一个文件的标题(第一行)长度可变;它是这样的:
"One"|"Two"|"Three"
或者
"One"|"Two"|"Three"|...|"One Hundred"
并想要执行一个循环将其转换为新文件:
"Hello One!"
"Hello Two!"
"Hello Three! ..."
"Hello One Hundred!"
我应该怎么办?用awk吗? sed?
如果不固定尺寸,我找不到解决方案。
我的操作系统是Linux-RedHat-RHEL-6
.
答案1
这是一个包含两个 sed 调用的简单解决方案(假设每一行都被引用):
sed -n '1s#"|"#"\n"#gp' file | sed 's#"\(.*\)"#"Hello \1!"#'
第一个 sed 命令替换“|”带换行符。其次添加文本和感叹号。
如果里面没有|
数据,周围"
都是可选的,也可以使用(应该更快):
head -1 file | tr \| \\n | sed 's#"\?\(.*\)"\?#"Hello \1!"#'
答案2
bash:将管道分隔的单词读入数组
IFS='|' read -ra words < <(head -n 1 file)
printf "Hello %s!\n" "${words[@]}"
awk:迭代该行中的单词。
awk -F'|' 'NR == 1 { for (i=1; i<=NF; i++) print "Hello " $i "!"; exit}' file
和一个 sed:
sed -e 2Q -e 's/\([^|]\+\)/Hello \1!/g' -e 's/[|]/\n/g' file