我试图在linux中使用sed命令搜索并替换字符串,但在STDERR中不断出现错误,例如
sed: -e expression #1, char 53: unterminated address regex
这是做什么的:
string="SOMEFILE.TXT SOMEFILE2.TXT SOMEFILE3.TXT"
path="/path/to/file/"
replace="TXT \] || \[ ${path}SOME"
formatted_string=`echo ${string} | sed -e "/TXT SOME/${replace}/g"`
if [ -e ${path}/${formatted_string} ]; then
最终目标是将一个格式化的字符串插入到if命令中,以查找一个或多个文件(如果存在)。带有文件的字符串可能会有所不同,这就是我这样做的原因。上面的代码有效,它确实找到了文件,但我无法摆脱错误。
感谢您的帮助
答案 0 :(得分:1)
正确的方式
array=( "SOMEFILE.TXT" "SOMEFILE2.TXT" "SOMEFILE3.TXT")
path_to_file="/path/to/file/"
file_exist=
for filename in "@{array[@]}"; do
if [ -e "${path_to_file}/${filename}" ]; then
file_exist=1
fi
done
if [ -n "${file_exist:+X}" ]; then
...
或更短(单行)
shopt -s extglob
if [ -e "/file/to/path/"@("SOMEFILE.TXT"|"SOMEFILE2.TXT"|"SOMEFILE3.TXT") ]; then
答案 1 :(得分:0)
你能试试这段代码吗?
string="SOMEFILE.TXT SOMEFILE2.TXT SOMEFILE3.TXT"
path="\/path\/to\/file\/"
replace="TXT \] || \[ ${path}SOME"
formatted_string=`echo ${string} | sed -e "s/TXT SOME/${replace}/g"`
echo $formatted_string
答案 2 :(得分:0)
听起来你需要的只是:
shopt -s nullglob
files=(/path/to/file/SOMEFILE*.TXT)
if [ ${#files[@]} -gt 0 ]; then
at least one file exists so do whatever...
fi
或者如果您想对文件列表执行某些操作:
var orderItemIds = shipment.ShipmentItems.Select(si => si.OrderItemId).ToList();
var shippedItems = shipment.Order.OrderItems.Where(oi => !orderItemIds.Contains(oi.Id));
答案 3 :(得分:-1)
感谢您的帮助!我最终完全省略了sed命令并找到了更实用的解决方案:
string="/path/to/file/SOMEFILE*.TXT"
files=$(ls ${string} 2> /dev/null | wc -l)
if [ **"$files" != "0"** ]; then
这就是我所需要的,并且比我之前尝试做的更容易阅读。