【问题标题】:sed: replace strings having issue due to special charactersed:替换因特殊字符而出现问题的字符串
【发布时间】:2019-11-17 00:07:17
【问题描述】:

请提出一个最佳解决方案来替换 bash 脚本中的以下字符串。

input_string= 'cn=xxxxx\, yyyyy (abc-ns),cn=users,dc=box,dc=com'
to_be_replaced_str= 'cn=aaaa\, bbbbb (abc),cn=users,dc=box,dc=com'

sed "s#'${input_str}'#'${replace_str}'#g" 

但是我没有得到任何结果,并且它没有随着期望的变化而改变。

input_string= 'cn=xxxxx\, yyyyy (abc-ns),cn=users,dc=box,dc=com'
to_be_replaced_str= 'cn=aaaa\, bbbbb (abc),cn=users,dc=box,dc=com'

sed "s#'${input_str}'#'${replace_str}'#g" 

input_string= 'cn=xxxxx\, yyyyy (abc-ns),cn=users,dc=box,dc=com'
to_be_replaced_str= 'cn=aaaa\, bbbbb (abc),cn=users,dc=box,dc=com'

sed "s#'${input_str}'#'${replace_str}'#g" 

空白输出。

【问题讨论】:

  • Bash Guide 将为您提供学习 Bash 的良好起点。
  • 明显问题:不能在赋值中=后面加空格,变量名不匹配。可能的问题:sed 命令中的单引号和/或字符串中的转义可能不需要,但如果不知道输入和预期输出是什么,我们就无法判断。
  • input_string='cn=xxxxx\, yyyyy (abc-ns),cn=users,dc=box,dc=com' to_be_replaced_str='cn=aaaa\, bbbbb (abc),cn= users,dc=box,dc=com' ,即使这也不起作用 sed "s#'${input_str}'#'${replace_str}'#g"
  • @Tkumar 究竟文件的原始内容和所需的替换内容是什么?单引号实际上是文件的一部分吗?反斜杠呢?您应该使用确切的文件内容(代码格式)编辑您的问题。不要将信息放在评论中,它们也不处理代码格式。
  • 嗨 GD,是的,单引号是文件的一部分,我们在这里所做的是提取 LDAP 用户定义并创建用其他用户连接字符串替换它,我已经给了你确切的内容.

标签: bash sed


【解决方案1】:

您的脚本 sn-p 中有几个问题:您不能在 shell 分配中的 = 周围放置空格,您分配的变量名称与您使用的名称不匹配,以及字符串中的反斜杠不对(如果它们是要替换的字符串的一部分,则它们需要加倍,因此sed 将它们视为文字反斜杠而不是转义)。固定这些后,它似乎对我有用。使用此脚本文件:

#!/bin/bash

input_string='cn=xxxxx\\, yyyyy (abc-ns),cn=users,dc=box,dc=com'
to_be_replaced_str='cn=aaaa\\, bbbbb (abc),cn=users,dc=box,dc=com'

sed "s#'${input_string}'#'${to_be_replaced_str}'#g" sample.txt

还有这个输入文件(sample.txt):

ldap_user = 'cn=xxxxx\, yyyyy (abc-ns),cn=users,dc=box,dc=com'

它产生这个输出:

ldap_user = 'cn=aaaa\, bbbbb (abc),cn=users,dc=box,dc=com'

如果实际文件中没有反斜杠,请将它们从两个字符串中删除。同样,如果实际文件中不存在单引号,请从 sed 命令中删除它们(但不要围绕变量赋值,这是 shell 语法的一部分)。

附言如果您包含实际的输入文件(或其相关部分)和所需的输出,这个问题会更容易和更快地回答。

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多