删除文件名中的特定字符
Remove specific characters in filename
是否有任何简单的解决方案如何在我的文件名中添加 trim 后缀?问题是,我的后缀长度不同。只有文件名中的相同字符串是_L001.
看例子:
NAME-code_code2_L001_sufix
NAME-code_L001_sufix_sufix2_sufix3
NAME-code_code2_code3_L001_sufix_sufix2_sufix3
我需要输出_L001之前的所有内容:
NAME-code_code2
NAME-code
NAME-code_code2_code3
我想做这样的事情(当后缀是固定长度时):
echo NAME-code_code2_L001_sufix | rev | cut -c 12- | rev
当然我的后缀长度是变化的。有什么bash或awk的解决方案吗?
谢谢。
我会提议sed。
sed 's|\(.*\)_L001.*||'
示例:
$ for LINE in NAME-code_code2_L001_sufix NAME-code_L001_sufix_sufix2_sufix3 NAME-code_code2_code3_L001_sufix_sufix2_sufix3; do echo "$LINE"|sed 's|\(.*\)_L001.*||';done
NAME-code_code2
NAME-code
NAME-code_code2_code3
您可以在 awk 中使用 _L001
作为字段分隔符并打印第一个字段:
awk -F '_L001' '{print }' file
NAME-code_code2
NAME-code
NAME-code_code2_code3
使用纯字符串操作技术:-
$ string="NAME-code_code2_L001_sufix"; printf "%s\n" "${string%_L001*}"
NAME-code_code2
对于文件中的所有行,您可以通过 bash
执行相同的操作,方法是读取内存中的文件并执行提取
# Setting a variable to the contents of a file using 'command-substitution'
$ mystringfile="$(<stringfile)"
# Read the new-line de-limited string into a bash-array for per-element operation
$ IFS=$'\n' read -d '' -ra inputArray <<< "$mystringfile"
# Run the sub-string extraction for each entry in the array
$ for eachString in "${inputArray[@]}"; do printf "%s\n" "${eachString%_L001*}"; done
NAME-code_code2
NAME-code
NAME-code_code2_code3
您可以通过将for循环中的printf
修改为
来将内容写入新文件
printf "%s\n" "${eachString%_L001*}" >> output-file
这是 grep
解决方案:这将从开始打印行,直到看到 _L001
。
grep -oP '^.*?(?=_L001)' inputfile
NAME-code_code2
NAME-code
NAME-code_code2_code3
许多方法可以做到这一点:
# Here is your Input text.
bash$> cat a.txt
NAME-code_code2_L001_sufix
NAME-code_L001_sufix_sufix2_sufix3
NAME-code_code2_code3_L001_sufix_sufix2_sufix3
bash$>
# Desired output using perl.
bash$> cat a.txt |perl -nle 'if (/^(.+)_L.*$/){print }'
NAME-code_code2
NAME-code
NAME-code_code2_code3
bash$>
# Desired output using sed.
bash$> cat a.txt |sed 's#\(.*\)_L001_.*##g'
NAME-code_code2
NAME-code
NAME-code_code2_code3
bash$>
# Desired output using cut
bash$> cat a.txt |cut -f1 -d "L"|sed 's/_$//g'
NAME-code_code2
NAME-code
NAME-code_code2_code3
bash$>
你也可以使用string substitution,
类似于:
for i in NAME-code_code2_L001_sufix NAME-code_L001_sufix_sufix2_sufix3 NAME-code_code2_code3_L001_sufix_sufix2_sufix3
do
echo ${i%_L001*}
done
是否有任何简单的解决方案如何在我的文件名中添加 trim 后缀?问题是,我的后缀长度不同。只有文件名中的相同字符串是_L001.
看例子:
NAME-code_code2_L001_sufix
NAME-code_L001_sufix_sufix2_sufix3
NAME-code_code2_code3_L001_sufix_sufix2_sufix3
我需要输出_L001之前的所有内容:
NAME-code_code2
NAME-code
NAME-code_code2_code3
我想做这样的事情(当后缀是固定长度时):
echo NAME-code_code2_L001_sufix | rev | cut -c 12- | rev
当然我的后缀长度是变化的。有什么bash或awk的解决方案吗?
谢谢。
我会提议sed。
sed 's|\(.*\)_L001.*||'
示例:
$ for LINE in NAME-code_code2_L001_sufix NAME-code_L001_sufix_sufix2_sufix3 NAME-code_code2_code3_L001_sufix_sufix2_sufix3; do echo "$LINE"|sed 's|\(.*\)_L001.*||';done
NAME-code_code2
NAME-code
NAME-code_code2_code3
您可以在 awk 中使用 _L001
作为字段分隔符并打印第一个字段:
awk -F '_L001' '{print }' file
NAME-code_code2
NAME-code
NAME-code_code2_code3
使用纯字符串操作技术:-
$ string="NAME-code_code2_L001_sufix"; printf "%s\n" "${string%_L001*}"
NAME-code_code2
对于文件中的所有行,您可以通过 bash
执行相同的操作,方法是读取内存中的文件并执行提取
# Setting a variable to the contents of a file using 'command-substitution'
$ mystringfile="$(<stringfile)"
# Read the new-line de-limited string into a bash-array for per-element operation
$ IFS=$'\n' read -d '' -ra inputArray <<< "$mystringfile"
# Run the sub-string extraction for each entry in the array
$ for eachString in "${inputArray[@]}"; do printf "%s\n" "${eachString%_L001*}"; done
NAME-code_code2
NAME-code
NAME-code_code2_code3
您可以通过将for循环中的printf
修改为
printf "%s\n" "${eachString%_L001*}" >> output-file
这是 grep
解决方案:这将从开始打印行,直到看到 _L001
。
grep -oP '^.*?(?=_L001)' inputfile
NAME-code_code2
NAME-code
NAME-code_code2_code3
许多方法可以做到这一点:
# Here is your Input text.
bash$> cat a.txt
NAME-code_code2_L001_sufix
NAME-code_L001_sufix_sufix2_sufix3
NAME-code_code2_code3_L001_sufix_sufix2_sufix3
bash$>
# Desired output using perl.
bash$> cat a.txt |perl -nle 'if (/^(.+)_L.*$/){print }'
NAME-code_code2
NAME-code
NAME-code_code2_code3
bash$>
# Desired output using sed.
bash$> cat a.txt |sed 's#\(.*\)_L001_.*##g'
NAME-code_code2
NAME-code
NAME-code_code2_code3
bash$>
# Desired output using cut
bash$> cat a.txt |cut -f1 -d "L"|sed 's/_$//g'
NAME-code_code2
NAME-code
NAME-code_code2_code3
bash$>
你也可以使用string substitution, 类似于:
for i in NAME-code_code2_L001_sufix NAME-code_L001_sufix_sufix2_sufix3 NAME-code_code2_code3_L001_sufix_sufix2_sufix3
do
echo ${i%_L001*}
done