用正则表达式查找`字符并替换它

时间:2016-02-04 15:45:09

标签: regex string replace

我在命令\grk{}中有一些看起来像这样的文字:

\grk{s`u e@i `o qrist`os <o u<i`ws to~u jeo`u `ao~u z~wntos} 

我需要找到所有存在空格后面跟`的实例,并用空格替换后跟单词XLFY

上述结果应为:

\grk{s`u e@i XLFYo qrist`os <o u<i`ws to~u jeo`u XLFYao~u z~wntos} 

应该忽略所有其他空格后跟`outside \ grk {}的实例。

我到目前为止:

(?<=grk\{)(.*?)(?=\})

查找并选择\grk{}

中的所有文字

我知道如何选择空格,然后选择里面的`并替换它?

2 个答案:

答案 0 :(得分:1)

你可以很容易地在编程语言的帮助下完成它(一些PHP代码来显示概念,也可以用其他语言来实现),这里的代码将文件内容考虑在内好:

<?php
foreach(glob(".*txt") as $filename) {
    // load the file content 
    $content = file_get_contents($filename);
    $regex = '#\\\grk{[^}]+}#';

    $newContent = preg_replace_callback(
        $regex, 
        function($matches) {
            $regex = '#\h{1}`#';
            return preg_replace($regex, ' XLFY', $matches[0]);
        },
        $content);

    // write it back to the original file
    file_put_contents($filename, $newContent);
}
?>

这个想法是在第一步中抓取grk和花括号之间的文本,然后替换每个出现的空格,后跟“`”。

答案 1 :(得分:1)

如果您的文件包含许多\grk{}个部分(以及其他部分),那么实现目标的最快方法可能是@Jan建议的。 @noob正则表达式适用于单\grk{}

(?<=grk\{)(.*?)(?=\})的问题在于,您无法在大多数正则表达式引擎中获得固定长度的后备,因此您无法在&#34;之前省略任何文本。 `&#34 ;.看看this post

您也可以使用bash脚本:

#!/bin/bash
file=$1
newFile=$file"_replaced"
val=`cat $file`
regex="\\\grk\{(.*?)\}"

cp $file $newFile

grep -oP $regex $file | while read -r line; do
    replacement=`echo $line | sed -r 's/(\s)\`/\1XLFY/g'`
    sed -i "s/$line/$replacement/g" $newFile
done

cat $newFile

文件作为参数并创建符合条件的 file_replaced

编辑:为目录中的每个文件运行脚本:

for file in *; do ./replace.sh $file; done;

之前更改脚本,覆盖现有文件:

#!/bin/bash
file=$1
val=`cat $file`
regex="\\\grk\{(.*?)\}"

grep -oP $regex $file | while read -r line; do
    replacement=`echo $line | sed -r 's/(\s)\`/\1XLFY/g'`
    sed -i "s/$line/$replacement/g" $file
done

但如果您不使用任何VCS,请备份您的文件!

EDIT2:debug

#!/bin/bash
file=$1
val=`cat $file`
echo '--- file ---'
echo $val
regex="\\\grk\{(.*?)\}"
echo 'regex: '$regex
grep -oP $regex $file | while read -r line; do
    echo 'LINE:        '$line
    replacement=`echo $line | sed -r 's/(\s)\`/\1XLFY/g'`
    echo 'REPLACEMENT: '$replacement
    sed -i "s/$line/$replacement/g" $file
done
echo '--- file after ---'
cat $file