标签: gnu-sed

sed给出:sed:无法读取:没有这样的文件或目录

我有以下bash脚本,对于找到的每个图像重复.它需要迭代所有html,cssjs文件,并替换该文件中所有出现的图像.

 for image in app/www/images-theme-dark/*.png
    do
        echo "installing icon" $image

        # extract filename from iconpath
        iconfile=$(basename $image)
        iconPath="images/"$(basename $image)

        # replace paths in all files containing icon paths
        find app/www -type f \( -name "*.html" -or -name "*.css" -or -name "*.js" \
                            -or -name "*.appcache" \)  \
            -exec sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}" \;

    done
Run Code Online (Sandbox Code Playgroud)

但是当我运行脚本时sed给出:

sed: can't read : No such file or directory

在StackOverflow上我发现sed:无法读取:没有这样的文件或目录但是我已经有了引号{} …

bash sed quoting gnu-sed

24
推荐指数
3
解决办法
3万
查看次数

为什么“sed -n -i”删除现有文件内容?

运行 Fedora 25 服务器版。sed --version给我sed (GNU sed) 4.2.2通常的版权和联系信息。我已经创建了一个文本文件sudo vi ./potential_sed_bug。Vi 将此文件的内容(:set list启用)显示为:

don't$
delete$
me$
please$
Run Code Online (Sandbox Code Playgroud)

然后我运行以下命令:

sudo sed -n -i.bak /please/a\testing ./potential_sed_bug

在我们讨论结果之前;这是sed 手册页所说的:

-n, --quiet, --silent 禁止自动打印模式空间

-i[SUFFIX], --in-place[=SUFFIX] 就地编辑文件(如果提供扩展名则进行备份)。默认操作模式是断开符号链接和硬链接。这可以通过 --follow-symlinks 和 --copy 进行更改。

我还查看了其他 sed 命令参考以了解如何附加 sed。根据我对我所做研究的理解;生成的文件内容应该是:

don't
delete
me
please
testing
Run Code Online (Sandbox Code Playgroud)

但是,运行sudo cat ./potential_sed_bug给了我以下输出:

testing
Run Code Online (Sandbox Code Playgroud)

鉴于这种差异,我对我运行的命令的理解不正确还是 sed/环境存在错误?

sed gnu-sed

6
推荐指数
1
解决办法
1130
查看次数

具有相同起始位置的相同长度正则表达式替代方案的决胜局

使用 GNU sed(-r为了清楚起见,使用标志),输入字符串上的以下两个替换ab给出相同的结果:

s/(.)(.)|(.)(.)$/\2\1\3\4/
Run Code Online (Sandbox Code Playgroud)

s/(.)(.)$|(.)(.)/\1\2\4\3/
Run Code Online (Sandbox Code Playgroud)

两者都给ba. 看起来,替代方案(.)(.)(没有 的那个$)在两次替换中都成功,无论其位置是第一个还是第二个替代方案。为什么会这样呢?这种替代方案的决定因素是什么?


正则表达式的 POSIX 规范指定1当替代方案从不同位置开始时(在这种情况下,优先选择较早的一个),以及当它们从相同位置开始但具有不同长度(优先选择较长的一个)时,决胜局,但是当两个替代方案从相同位置开始且具有相同长度时,它似乎没有指定捕获组的行为,因此将其留给具体实现。

对匹配序列的搜索从字符串的开头开始,并在找到与表达式匹配的第一个序列时停止,其中“first”被定义为表示“在字符串中最早开始”。如果模式允许可变数量的匹配字符,因此从该点开始有多个这样的序列,则匹配最长的这样的序列。[...] – The Open Group 基本规范第 7 期,2018 年版

这是该现象的一个运行示例。

s/(.)(.)|(.)(.)$/\2\1\3\4/
Run Code Online (Sandbox Code Playgroud)

在线尝试一下!

regex sed gnu-sed

5
推荐指数
1
解决办法
102
查看次数

GNU sed 和 BSD sed 区别说明

我写了以下命令

echo -en 'uno\ndue\n' | sed -E 's/^.*(uno|$)/\1/'
Run Code Online (Sandbox Code Playgroud)

期待以下输出

uno

Run Code Online (Sandbox Code Playgroud)

我的 GNU Sed 4.8 确实就是这种情况。

但是,我已经验证 BSD Sed 输出



Run Code Online (Sandbox Code Playgroud)

为什么会这样?

bsd gnu sed gnu-sed

5
推荐指数
1
解决办法
2532
查看次数

用GNU sed(macOS)4.4替换另一个捕获组

我已经查看了一些其他外围问题并且无法找到问题的解决方案,所以如果这与我错过的内容重复,我很抱歉.

基本上,我有以下GNU sed命令:

sed -E -imr 's/^(\w)+/(\w)+$/g' file
Run Code Online (Sandbox Code Playgroud)

应该用行的最后一个单词替换行的第一个单词.

第一个正则表达式^(\w)+非常有效,并匹配每一行的第一个单词.问题是该命令用文字字符串替换了第一个单词(w)+$

我试图逃避反斜杠,括号,运算符,但我没有运气使正则表达式在命令的输出部分工作.

可以使用正则表达式捕获组来替换不同的正则表达式捕获组吗?需要转义什么,或者需要使用哪种替代语法?

注意

我在brew安装的coreutils上使用了macOS上的GNU sed,所以这个问题的答案可能不适用于其他版本的sed,就像macOS上的本地BSD一样.

regex sed gnu-sed

1
推荐指数
1
解决办法
657
查看次数

标签 统计

gnu-sed ×5

sed ×5

regex ×2

bash ×1

bsd ×1

gnu ×1

quoting ×1