命令的每个输出行的前缀和后缀字符串

命令的每个输出行的前缀和后缀字符串

我在尝试编写 Bash 脚本时遇到了问题。输出时grep,它(通常)返回许多行。我想为每个输出行添加一个字符串前缀和后缀。

我还想指出,我正在管道lsgrep,例如:

ls | grep

答案1

使用 sed:

ls | grep txt | sed 's/.*/prefix&suffix/'

答案2

sed

ls | grep pattern | sed -e 's/^/prefix/' -e 's/$/suffix/'

但请注意,这会遇到带换行的文件名问题,以及所有各种解析问题,ls这通常是一个坏主意。

用perl

perl -e 'print "prefix".$_."suffix\n" for grep { m/somepattern/} glob "*"'

注意 - perlgrep可以采用模式 - 就像grep命令一样,但您也可以执行诸如应用文件测试之类的操作。

例如

grep {-d} glob "*" #filters directories.
grep { (stat)[9] > time() - 60 } glob "*" #reads file mtime and compares. 

grep默认迭代器内$_设置为当前元素值,因此您可以应用sed/ grepstyle 正则表达式,或执行基于$_.

答案3

在这种情况下,GNUfind让您一次性完成所有这些事情,消除了管道和潜在的麻烦解析ls

find . -maxdepth 1 -name '[^.]*' \
  -regextype posix-extended -regex "MYPATTERN" \
  -printf 'SOMEPREFIX %f SOMESUFFIX\n'

find当然,这不是任意修改其他命令的输出的好方法!)

一些注意事项:

  • -maxdepth 1并使-name [^.]*名称匹配的工作方式与普通ls(或ls .)相同。您可以使用任何 shell 样式的 glob,但请注意“*”将匹配前导“.”。名称与 不同bash,所以[^.]*意味着任何没有前导“.”
  • MYPATTERN 是一个正确的 POSIX ERE(默认类型是 Emacs,请参阅这里),它必须匹配整个文件名(包括./前缀),所以使用类似的东西.*thing.*而不是仅仅thing
  • 你可以大概-name只需使用/之一-regex而不是两者(例如 -regex "[^.].我的模式。
  • -printf支持很多东西,%n是未修饰的文件或目录名称
  • 请注意find(与 相反ls)不会对文件名列表进行排序。
  • 它假定文件名构成当前语言环境中的有效文本。

(这可能取决于您的版本find,请检查手册页的“标准一致性”部分)

作为一种不需要外部程序的可能替代方案,除其他外,bash它还compgen扩展了全局变量,相当于ls不带选项的情况:

compgen -P "someprefix>" -S "<somesuffix" -G "pattern"

这会处理带有空格的文件名,包括换行符。compgen -G "*"应该提供与普通输出相同的输出ls(但请注意,这ls *是完全不同的事情)。您仍然需要grep,这可能会也可能不会解决问题,但值得一提。

答案4

awk

ls | grep | awk '$0="prefix"$0"suffix"'

"prefix""suffix"是字符串文字,因此请将文本替换为您想要的任何内容。


资料来源:https://stackoverflow.com/a/2099492/2089675

相关内容