读取可变大小的行并将其内容分成带有文本的单独行

读取可变大小的行并将其内容分成带有文本的单独行

我有一个文件的标题(第一行)长度可变;它是这样的:

"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

相关内容