我正在编写一个BASH脚本,我想用Path= readlink -e /home/user/Videos/*.mp4
sed -i "s/original_text/$Path/g" /home/user/Documents/Text.txt
将文件的完整路径替换为文本。
我目前有这个:
void Main()
{
var keyValuePairs = new List<KeyValuePair>
{
new KeyValuePair {Key = "Name", Value = "Test"},
new KeyValuePair {Key = "Age", Value = "42"},
new KeyValuePair {Key = "Country", Value = "USA"}
};
var list = new List<Filter>();
list.Add(new Filter { Name = "Test", Age = "42", Country = "USA" });
list.Where(keyValuePairs.ToPredicate<Filter>()).Dump();
}
public class Filter
{
public string Name { get; set; }
public string Age { get; set; }
public string Country { get; set; }
}
public class KeyValuePair
{
public string Key { get; set; }
public string Value { get; set; }
}
public static class KeyValuePairExtensions
{
public static Func<T, bool> ToPredicate<T>(this IEnumerable<KeyValuePair> keyValuePairs)
{
if (keyValuePairs == null || !keyValuePairs.Any())
return t => false; // default value in case the enumerable is empty
var parameter = Expression.Parameter(typeof(T));
var equalExpressions = new List<BinaryExpression>();
foreach (var keyValuePair in keyValuePairs)
{
var propertyInfo = typeof(T).GetProperty(keyValuePair.Key);
var property = Expression.Property(parameter, propertyInfo);
var value = Expression.Constant(keyValuePair.Value, propertyInfo.PropertyType);
var equalExpression = Expression.Equal(property, value);
equalExpressions.Add(equalExpression);
}
var expression = equalExpressions.First();
if (equalExpressions.Count > 1)
{
// combine expression with and
expression = Expression.AndAlso(equalExpressions[0], equalExpressions[1]);
for (var i = 2; i < equalExpressions.Count; i++)
{
expression = Expression.AndAlso(expression, equalExpressions[i]);
}
}
var lambda = (Func<T, bool>)Expression.Lambda(expression, parameter).Compile();
return lambda;
}
}
我的想法是将单个MP4视频的路径(该文件夹中没有其他视频)替换为文本文件,这样每次我想要替换它时都不必写出视频名称
我已经为这个问题尝试了不同的选项,但是我无法使其发挥作用。
提前致谢。
答案 0 :(得分:1)
使用命令替换将命令的输出保存在变量中:
Path="$(readlink -e /home/user/Videos/*.mp4)"
在声明变量时,shell也不支持=
周围的任何空格。
如果您有多个文件,最好使用数组:
Paths=( $(readlink -e /home/user/Videos/*.mp4) )
并按"${Paths[@]}"
答案 1 :(得分:1)
我相信您的$Path
有slash(/)
的价值,例如/home/user/Videos/foo.mp4
,这会让您sed
失败。您可以对sed的s
命令使用其他分隔符。
试试这个sed行:
sed -i "s@original_text@$Path@g" /home/user/Documents/Text.txt
您也应引用readlink
命令,并在=