【发布时间】:2018-06-05 10:41:49
【问题描述】:
我在一个 linux 服务器上合并了一些文本文件,但其中的行略有不同,我需要将它们统一起来。
例如一些文件会有类似的行
id='1244' group='american' name='fred',american
其他文件会这样
id='2345' name='frank', english
最后别人会喜欢
id='7897' group='' name='maria',scottish
我需要做的是,如果 group='' 或 group 根本不在字符串中,我需要在逗号之前的某处将其添加到逗号之后的文本中,因此在该行上方的第二个示例中变成:
id='2345' name='frank' group='english',english
和上一个例子中的一样
id='7897' name='maria' group='scottish',scottish
这将进入一个 bash 脚本。我实际上无法删除该行并添加到文件末尾,因为它与以下行相关。
我用过以下:
sed -i.bak 's#group=""##' file
删除 group="" 字符串,因此行将包含 group='something' 或根本不包含它并且有效
然后我尝试使用以下方法添加该组(如果它不存在):
sed -i.bak '/group/! s#,(.*$)#group="\1",\1#' file
但这会引发错误
sed: -e expression #1, char 38: invalid reference \1 on `s' command's RHS
EDIT 由 Ed Morton 创建一个示例输入文件和预期输出:
示例输入:
id='1244' group='american' name='fred',american
foo
id='2345' name='frank', english
bar
id='7897' group='' name='maria',scottish
预期输出:
id='1244' group='american' name='fred',american
foo
id='2345' name='frank' group='english',english
bar
id='7897' name='maria' group='scottish',scottish
【问题讨论】:
-
到目前为止你尝试过什么?让我们看看一些代码:-)
-
抱歉,我已经编辑了我的问题以展示我的尝试。
-
在 BRE(基本正则表达式)语法中,sed 的默认模式语法,捕获组的括号必须被转义:
\(.*$\)否则,它们被视为文字字符。 -
我编辑了您的问题以尝试提供 1 个示例输入文件以及给定该输入的预期输出。如果是错误的,请修复它。一堆单独的输入行,一些具有预期的输出,一些没有,并且没有一个具有周围行的上下文,不如一个具有上下文的具体示例有用。