【问题标题】:Replace string pattern with a string in linux file [closed]用linux文件中的字符串替换字符串模式[关闭]
【发布时间】:2018-06-28 09:42:06
【问题描述】:

我是 Linux 的新手。需要更换

/en/family/bitstream/ambiance-bt
/en/family/zxcvbn/bernhard-fashion
/en/family/qwerty/century-751
/en/family/abcd/century-expanded
/en/family/xyz/charter-bt
/en/fonts/sdfsd/dsfsdfs

/en/family
/en/family
/en/family
/en/family
/en/family
/en/fonts/sdfsd/dsfsdfs

使用 sed 或其他替代方法。

【问题讨论】:

标签: linux shell unix sed


【解决方案1】:

给我想要的结果的命令是:

sed  's/\/en\/family\/\.*.*/FamilyPage/' filename

【讨论】:

    【解决方案2】:

    如果您的文件内容看起来像:

    /en/family/bitstream/ambiance-bt
    /en/family/zxcvbn/bernhard-fashion
    /en/family/qwerty/century-751
    /en/family/abcd/century-expanded
    /en/family/xyz/charter-bt
    /en/fonts/sdfsd/dsfsdfs
    

    使用下面的 sed 表达式来获得预期的输出:

    sed  's/\/en\/family\/\*.*/\/en\/family/' yourfilename 
    

    要永久更改您的文件名,请使用以下 sed 表达式

    sed -i 's/\/en\/family\/*.*/\/en\/family/' yourfilename   
    

    【讨论】:

    • 为什么在模式正则表达式中使用'*.*'? '*' 就够了?
    • 如果你使用 "*" 那么它不会从 "/en/family" 替换整行它会给你输出 /en/familybitstream/ambiance-bt 根据问题是不期望的.
    • 是的,抱歉,'.*' 是必要的。但是你的命令是错误的,你没有匹配它。试试看。这是因为你的 '*' 在 '.*' 之前。当要替换的文本也包含“/”时,使用“/”来分隔替换命令的字段是一个坏主意。这会使命令不可读并导致一些错误,例如您的错误
    • 我尝试了你的 sed 表达式,但没有给出想要的结果。
    【解决方案3】:

    试试这个命令:

    sed 's/pattern_to_replace/string_to_insert/' yourfile
    

    我不给你更精确的例子,因为我不明白你想替换什么。

    Edit1,在您的第一条评论之后:

    sed 's@/en/family/.*@FamilyPage@' yourfile
    

    【讨论】:

    • pattern_to_replace 在 /en/family/**** 之后发生变化
    • 需要删除像“/bitstream/ambiance-bt”这样的结束部分,但是上面的命令只替换开始部分,其余部分保持不变
    • 上述命令将所有行开头替换为 /en/family/ 并将其替换为 FamilyPage。您需要保留 '.*' 以匹配行尾。根据您的示例,此命令应有效 sed 's@/en/family.*@/en/family@' yourfile.
    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2014-03-06
    • 1970-01-01
    • 2013-09-16
    相关资源
    最近更新 更多