【问题标题】:sed is not changing the string [duplicate]sed 没有改变字符串[重复]
【发布时间】:2018-12-07 10:06:11
【问题描述】:

我有 3 个文件:

File1: &VAR1='1111';
File2: &VAR2 = '2222';
File3: &VAR1 = 1111

我想改变它,例如用 &NEWVAR = 'NEW';

所以我有以下脚本:

A="\&VAR1\s*\=\s*'*[1]{4}'*"
for f in /u/123456/*; do
    if grep -qE $A $f; then
        sed 's/$LAREXP/$LACADE/g' $f
    fi
done

Grep 告诉我 File1 和 File3 有巧合,这是正确的,但是 sed 命令不会用这些文件中的新字符串替换旧字符串。它在屏幕上显示文件的内容,但没有替换。

谁能帮我解决这个问题?

问候,

【问题讨论】:

  • 试试sed -i,这会在原地编辑文件,而不是将结果打印到终端上
  • sed 命令中的美元符号是干什么用的?如果它们是字符串的结尾,那么模式将永远不会匹配,如果它们是 shell 变量,那么它们将不会被扩展,因为它们在单引号内。
  • 最后,sedgrep 都不支持像 \s 这样的 PCRE 正则表达式;见stackoverflow.com/questions/11568859/…

标签: unix sed sh


【解决方案1】:

您需要使用sed -i 就地更改文件。

sed 是一个 Stream 编辑器,因此,默认情况下,它会编辑它读取的数据,然后将其写入标准输出。传递-i 告诉sed 将更改写回命令行中给出的文件。

【讨论】:

  • 感谢@Jonathon 我使用了 -i 并且文本停止在屏幕上显示,但文本没有改变。其实这2个文件已经被编辑过了,但是sed什么也没做。
【解决方案2】:

不清楚你想要完成什么。 明显的错误在以下带注释的代码中得到修复。

# The regex is probably also incorrect; see blowe
A="\&VAR1\s*\=\s*'*[1]{4}'*"
for f in /u/123456/*; do
    # Add quotes around regex and filename
    if grep -qE "$A" "$f"; then
        # single quotes will not work; use doubles
        # add -i option for in-place editing
        # again, add duoble quotes around filename
        sed -i "s/$LAREXP/$LACADE/g" "$f"
    fi
done

正则表达式在sed 中肯定不起作用,在grep 中也可能不起作用。有许多不同的正则表达式方言,并且您使用了来自 Perl/Python 正则表达式的结构,这些结构通常不受旧工具的支持。 也许你的意思是

A="\\\\&VAR[[:space:]]*=[[:space:]]*'*1111'*"

这应该适用于 POSIX grep 和 POSIX sed。一些平台支持 sed -Esed -r 使用称为 POSIX 扩展正则表达式的东西......但实际上这太投机了,没有任何迹象表明正则表达式应该匹配什么。

一种常见的解决方法是使用 Perl。

perl -pi -e "s/$LAREXP/$LACADE/g" /u/123456/*

还取决于 LAREXPLACADE 中的内容。

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2014-09-17
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多