【发布时间】:2017-11-10 12:38:08
【问题描述】:
我有一个要修改的文本文件。我正在使用具有以下形式的行的输入文件
(y+1/4,-x+1/2,z+3/4)
并尝试将其更改为
0 1 0 -1 0 0 0 0 1 1 / 4 1 / 2 3 / 4
我目前可以达到这一点
0 1 0 1/4 -1 0 0 1/2 0 0 1 3/4
使用
#!bin/bash
filename="227.dat"
sed -i 's/(/ /g' $filename
sed -i 's/)//g' $filename
sed -i 's/,/ /g' $filename
sed -i 's/-x/-1 0 0/g' $filename
sed -i 's/x/ 1 0 0/g' $filename
sed -i 's/-y/ 0 -1 0/g' $filename
sed -i 's/y/ 0 1 0/g' $filename
sed -i 's/-z/ 0 0 -1/g' $filename
sed -i 's/z/ 0 0 1/g' $filename
sed -i '/+/! s/$/ 0 \/ 1 0 \/ 1 0 \/ 1/' $filename
while ((i++)); read -r line; do
if [[ $line == *[+]* ]]
then
sed -i 's/+/ /g' $filename
echo $i
fi
done < "$filename"
echo $i 的原因是为了看到它正确地给出了行号,我想也许我可以将它用于那些特定行的命令。我正在做这种转换,因为我们在创建晶体结构时使用的代码需要最后带有分数的矢量符号,而不是 x、y、z 符号。我已经知道这不是“最漂亮”或最简单的解决方案,但我对这一切都很陌生,这是我迄今为止能够拼凑起来的。有什么建议吗?
【问题讨论】:
-
每次运行
sed -i时,这确实非常昂贵(您正在启动一个新程序,让它创建一个新的输出文件,然后将该输出文件重命名为旧文件......对于每个单一变化,在目前的表述中)。最好运行 一个sed实例,它可以一次性完成所有操作 - 或者首先使用 native string manipulation 而不是外部工具。 -
例如,如果您可以编写一个匹配您的输入流的正则表达式,您可以使用
[[ $line =~ $regex ]]将正则表达式的组放入BASH_REMATCH数组中——那么您只有 一个echo命令将这些组按正确的顺序排列,很容易。 -
现在不容易的是准确解析现有代码的工作原理,从而弄清楚你声明的输入和声明的输出之间的预期关系是什么——使得编写任何从头开始的重新实现变得不必要地困难,但是在当前情况下这样做可能是显而易见的正确事情。
-
我知道这不是最好的方法,但我只需要一些可行的方法,并且可以担心以后对其进行优化。我不确定什么是正则表达式(如前所述,我对这一切都很陌生)。至于输入/输出关系,我将 x,y,z 分别更改为 100,010,001 并且需要将任何添加的分数移动到行尾,所有这些都显示为间距。
-
这是您的第三个几乎相同的问题,我仍然很难理解您要做什么。你能描述一下潜在的问题吗?我知道这与单位向量有关。但是您的输入如何映射到您的预期输出?