【发布时间】:2015-03-30 10:02:56
【问题描述】:
我尝试使用 sed 从 ASCII 文件中读取一行,对其进行解析并将其写入输出文件中的定义行号。
输入文件中的行格式如下:
linenumber:designator,"variable text content"
例如
3:string1,"this is text of string 1"
所以第 3 行的 outfile 应该如下所示:
string1,"this is text of string 1"
该行包括双引号和空格。所有旧行都下移了一行。
用户负责提供有关行顺序的正确输入文件,并且必须考虑输出文件中的行随着输入文件中的每一新行而下移。除了输入文件中给出的行号之外,脚本不知道任何顺序。
脚本应读取所有行并将这些行的内容放入给定行号的输出文件中
- 包括双引号和空格
- 没有行号部分和冒号
我在 shell 中成功使用的命令是 e.g.:
sed -i '3istring1,"this is text of string 1"' outfile
引号,双引号和空格没有问题。 使用 bash 脚本
while read line
do
linenum=$(echo $line | cut -f1 -d:)
linestr=$(echo $line | cut -f2 -d:)
sedcmd="sed -i '"
sedcmd=${sedcmd}${linenum}
sedcmd=${sedcmd}i
sedcmd=${sedcmd}${linestr}
sedcmd=${sedcmd}"' outfile"
echo "---> $sedcmd"
$sedcmd
done < script/new_records.txt
显示与 echo 完全相同的 sed 命令,但返回:
sed: -e expression #1, char 1: unknown command: `''
显然,从 bash 脚本中执行 sed 命令与直接在 bash shell 中执行它是不同的。 我在引号、双引号和空格之前尝试了各种转义序列“\”……但相当随机,都没有成功。
我需要做什么才能将包含空格和双引号的字符串写入文本文件中的指定行?
【问题讨论】:
-
请提供一些示例输出。例如,给定一个数据文件
1\n2\n3\n4\n5\n6和一个输入文件2:foo,"bar"\n4:baz,"qux",结果应该是什么?与4:baz,"qux"\n2:foo,"bar"相同转换的结果应该不同吗? -
我编辑了帖子以澄清问题。用户负责输入文件中的正确顺序。
-
我很抱歉,但我的意思从编辑中并不清楚。我的意思是:
4:baz,"qux"是否意味着baz,"qux"应该作为输出中的第四行出现,或者应该插入到输入中最初的第四行之前?当在该点之前已经插入一行时,这会有所不同。反过来也很重要——如果插入第四行,然后插入第二行,第四行将被向下推。这是想要的吗? (哦,应该插入到指定行之前还是之后?)