修改文件内的数据分布

时间:2015-03-01 07:14:57

标签: bash

我需要帮助bash才能修改file.txt。我有名字,每个名字都在一行

例如

Peter
John
Markus

我需要他们在同一行和"在向量的每个元素之前和之后。

"Peter" "John" "Markus"

好吧,我可以插入"当我连续所有元素但我不知道如何修改形状......连续的所有行。

array=( Peter John Markus )

number=${#array[@]}
for ((i=0;i<number;i++)); do
array[i]="\"${array[i]}"\"
echo "${array[i]}"
done

2 个答案:

答案 0 :(得分:2)

使用awk

$ awk '{printf "\""$0"\" "} END{print""}' file
"Peter" "John" "Markus" 

工作原理:

  • printf "\""$0"\" "

    对于每一个新输入行$0,这会打印出引号,行本身,引号和空格。

  • END{print""}

    (可选)在我们读完文件的最后一行后,会打印出换行符。

使用sed和tr

$ sed 's/.*/"&"/' file | tr '\n' ' '
"Peter" "John" "Markus" 

工作原理:

  • s/.*/"&"/

    这会在每行

  • 之前和之后加上引号
  • tr '\n' ' '

    这将使用空格替换换行符,以便所有名称显示在同一行。

单独使用sed

$ sed ':a;$!{N;ba};s/^/"/; s/$/"/; s/\n/" "/g' file
"Peter" "John" "Markus"

工作原理:

  • :a;$!{N;ba}

    这会将整个文件读入模式空间。

  • s/^/"/

    这会在文件开头添加引号

  • s/$/"/

    这会在文件末尾添加引号。

  • s/\n/" "/g

    这将使用以下三个字符替换每个换行符:quote-space-quote。

使用bash

要将问题中的bash脚本打印在一行,可以使用echo -n代替echo。换句话说,替换:

echo "${array[i]}"

使用:

echo -n "${array[i]} "

在一行中引用所有单词

从评论中,假设我们的文件在一行中包含所有名称,并且我们想要单独引用每个名称。使用:

$ cat file2
Peter John Markus
$ sed -r 's/[[:alnum:]]+/"&"/g' file2
"Peter" "John" "Markus"

以上是GNU sed。在OSX或其他BSD系统上,尝试:

sed -E 's/[[:alnum:]]+/"&"/g' file2

答案 1 :(得分:0)

Perl救援:

perl -pe 'chomp; $_ = qq("$_" );chop if eof' < input

说明:

  • -p逐行读取输入并打印$_
  • 中的内容
  • chomp删除换行符
  • $_ = qq("$_" )"放在字符串之后,"<Space>放在字符串之后。
  • chop if eof删除尾随空格。