大小写转换
tr
$ echo file | tr a-z A-Z
FILE
$ echo FILE | tr A-Z a-z
file
$ tr [:lower:] [:upper:]
$ tr [:upper:] [:lower:]
sed
$ sed 's/[a-z]/\U&/g'
$ sed 's/[A-Z]/\L&/g'
替换字符串
example1 fasta DNA > RNA
sed 's/原字符串/目标字符串/g' file
批量替换多文本中的字符串
sed -i "s/原字符串/目标字符串/g" `grep 原字符串 -rl 需要批量替换的文件或文件夹目录`
windows 到 linux,行后缀的处理
将在 Windows 下创建的文本文件传输到 Linux 上时,要注意二者行后缀不同 (windows \n\r
, linux \n
)。
忽略这一点,往往会导致一些后续操作出现莫名其妙的问题。
通过 vim -b
或者 cat -A
文件可以看到每行后会有 ^M
。
搜罗了以下几种方法:
tr :
tr -d '\r' ## 删除 \r
sed
sed 's/^M$//g' filename > tmp_filename
使用sed 工具:需要注意打^M时应输入Ctrl+v+m,长按Ctrl依次点击v和m键 (或者输入Ctrl+V,然后输入Ctrl+M),而不是数字6上的^符号。
referencedos2unix (if installed)
vim
- 行数不多,直接删除
^M
- 命令模式下输入
:set fileformat=unix
- 行数不多,直接删除
xargs
-I
指定每一项命令行参数的替代字符串
$ cat foo.txt
one
two
three
$ cat foo.txt | xargs -I file sh -c 'echo file; mkdir file'
one
two
three
echo
常用的参数
-e
- 启动反斜杠转义解释,如将
\n
解释为换行,不设置-e
,会直接打印\n
rename
mv
和 rename
都有重命名的功能,但是 mv
只能对单个文件重命名,而 rename 则可以实现批量重命名
Linux 中 rename
有两个版本(C
and perl
), 详见linux中mv和rename的区别
C 版本的 rename 格式就是:
rename from to file
- from, 修改什么名字
- to, 改成什么名字
- file, 对什么文件修改
example:
# change "txt" suffix into bed for all .txt file.
rename txt bed *.txt
注意:上述替换,只会发生在第一个匹配的字符串,所以感觉安装个 perl 版本的 rename 很舒服?
缺点是无法实现循环,按标号重命名的目的。
perl 版本的好处就是可以使用正则表达式
文件/文件夹判断
判断文件是否存在
if [ ! -f "$file" ]; then echo "file not exist"; fi
判断文件是否为空
if [ ! -s "$file" ]; then echo "file is NULL"; fi
–b 当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 判断对象是否存在
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 判断对象是否存在,并且可写
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新
-ot 判断file1是否比file2旧