如何使sed忽略斜杠和反斜杠

时间:2014-07-06 14:37:16

标签: bash sed backslash slash

好的:首先,我在发布此答案之前尝试搜索答案。我不是说,没有,我只是说,我找不到一个。为了我的辩护:我被迫从脚本和其他有趣的工作转变为杂货店助理,所以我的大脑可能已经腐烂了。

我要做的是以下内容:

我有一个文件,其中包含对包括EAN代码在内的商品的描述。没有合适的分隔符。我只有“列长”。我知道,EAN代码列从位置134开始,到147位置结束。

我试过用这个:

cat $processedFile | sed "s/^(.{134})/\1;/g" | sed "s/^(.{148})/\1;/g >> $outFile

  • 原因是,我正在努力确保EAN代码放在两个分号之间以便进一步处理。工作得非常完美。

我的问题是:

由于使用生成文件的软件的人非常不信任计算机,因此在命名商品时并不关心他们使用什么。因此,某些项目包含斜杠或反斜杠作为其名称的一部分,然后是文件中的另一列,顺便说一下就在EAN前面。

因此,某些列仍未处理。

输入文件示例:

00110363 201406170014469 35.0 1 35.000 0.2360 0.3720 T SnackName001 chees-onion8588004269750 0291410610363 0 0.00.000 00110363 201406170013935 24.0 1 24.000 0.2780 0.4320 T SnackName002 blah-blah-b78588000510535 0291410610363 0 0.00.000 00110363 201406170013936 24.0 1 24.000 0.2780 0.4320 T SnackName003 blah-blah-b78588000510511 0291410610363 0 0.00.000 00110363 201406170016056 18.0 1 18.000 0.2033 0.3520 T SnackName004 blah-blah 3838700069938 0291410610363 0 0.00.000 00110363 201406170013808 10.0 1 10.000 0.5794 0.9220 T SnackName005 blah-blah-b8588000467617 0291410610363 0 0.00.000 00110363 201406170009326 8.0 5 40.000 0.7500 1.2120 T Sugar powd. brandN\ED1kg 8594003782411 0291410610363 0 0.00.000

最后一行是导致我头痛的一个例子。

任何提示?或者......使用与sed完全不同的东西会更好吗?

我需要确保这些脚本是无懈可击的,因为我希望那些在底盘上找不到电源按钮的人将会在以后与他们合作。

编辑:我道歉,我没有意识到,EAN在我的例子中并不那么容易区分^ _ ^; ,谢谢你,condorwasabi。

EAN代码是整数后面的字符串名称。更确切地说: 在 00110363 201406170014469 35.0 1 35.000 0.2360 0.3720 T SnackName001 chees-onion8588004269750 0291410610363 0 0.00.000 8588004269750是EAN部分。是的,在文件中,如果名称太长,则没有空格,冒号,分号或任何其他字符来标记名称的末尾和EAN代码的开头。

1 个答案:

答案 0 :(得分:1)

我建议使用awk

我对要求并不完全清楚,但这可能会让你开始:

awk '{ 
    cleanLine=substr($0,1)
    gsub(/\\[A-Z]{2}/, "", cleanLine)
    EAN=substr(cleanLine, 134, 13)
    sub(EAN, ";" EAN ";")
    print
 }' file
  • 暂时创建输入行的清理版本,其中删除了\ED等序列 - 任意序列\后跟两个大写字母。您还在提问中提到/ - 不确定要在哪个模式中查找,但最终的正则表达式必须替换上面的/\\[A-Z]{2}/
    注意:
    • 这里我假设清理只是意味着删除这些序列 - 另一方面,如果它们各自代表特定数量的原始字符,则替换{{ 1}} ""的参数,其字符串由虚拟字符组成,例如gsub()
    • 假设所有这样的序列都是要删除的无关序列。
  • 按字符位置从清理后的行中提取EAN。
  • 原始行中的EAN替换为“;”中的EAN并打印结果。
    • 请注意,这假设EAN在输入文件中的列134之前也不会出现