【问题标题】:Ubuntu sed creates duplicate lines instead of returning just one replaced lineUbuntu sed 创建重复的行而不是只返回一个替换的行
【发布时间】:2016-09-17 08:04:24
【问题描述】:

我有下面的脚本来提取 Gedit 中当前打开的文件路径。

#!/bin/bash
origPath=$GEDIT_CURRENT_DOCUMENT_URI
if [[ $origPath == *"smb"* ]]
then
    finalPath=`php -f /var/www/html/pathswapcmd.php smb_path=$origPath`;
else
    finalPath=$origPath;
fi
## echo -n $finalPath;
echo -n $finalPath | sed 's/^.*app/app/p' | xclip -sel clip;
exit;

通常我的系统中有 Magento 文件,所以我的路径只需要从 appskin 文件夹等开始。

现在,当我尝试使用 sed 删除 app 之前的所有内容时,它会删除,但它会使用 Ubuntu 文件夹管理器地址栏中无法识别的垃圾字符(当然)将路径分开三倍。

我想要从sed 命令中删除重复行的简单而清晰的解决方案。

【问题讨论】:

  • php部分在哪里?
  • @Epodax finalPath=`php -f /var/www/html/pathswapcmd.php smb_path=$origPath`; ?
  • 不是粗鲁,但知道php脚本输出是否相关?好像我删除了sed 行,那么它给我的路径就好了,并且在剪贴板中只有一次,但是当我使用sed 时,它给出了由垃圾字符分隔的重复路径(可能是换行符)。我只是我使用了php脚本来检测路径是基于smb还是基于ftp

标签: php bash magento ubuntu sed


【解决方案1】:

s/pattern/replacement/p默认会在任何操作完成后输出行缓冲区,如果由于p标志执行了替换,也会再次输出。删除 p 标志以避免再次打印替换的行,或将 -n 参数提供给 sed 以避免打印每一行。

sed -n 's/pattern/replacement/p'  # print only lines where replacement happened

sed 's/pattern/replacement/'      # print all lines, possibly with replacements

【讨论】:

  • 如果我删除p 标志,那么我需要在它的位置放置一些其他字符吗?或就像sed 's/^.*app/app/' 请以完整的格式和代码回答。同时发布您拥有的任何参考链接。
  • 谢谢它的工作,但如何删除替换行末尾的垃圾字符?
  • 什么垃圾字符?
  • 可能是换行符,但在 Ubuntu 文件夹管理器地址栏中显示为垃圾。
  • @Amadan 猜这是回车?
猜你喜欢
  • 2014-07-07
  • 2016-01-23
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
相关资源
最近更新 更多