我在尝试编写 Bash 脚本时遇到了问题。输出时grep
,它(通常)返回许多行。我想为每个输出行添加一个字符串前缀和后缀。
我还想指出,我正在管道ls
中grep
,例如:
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
/ grep
style 正则表达式,或执行基于$_
.
答案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"
是字符串文字,因此请将文本替换为您想要的任何内容。